summaryrefslogtreecommitdiffstats
path: root/testapi/opnfv_testapi/ui/components/scenarios
diff options
context:
space:
mode:
Diffstat (limited to 'testapi/opnfv_testapi/ui/components/scenarios')
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html38
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/installerModal.html59
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/projectModal.html59
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioModal.html59
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioNameUpdate.html28
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/scoreModal.html51
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/trustIndicatorModal.html49
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/versionModal.html68
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/scenario/scenario.html234
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/scenario/scenarioController.js605
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/scenarios.html63
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/scenariosController.js513
12 files changed, 1826 insertions, 0 deletions
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html
new file mode 100644
index 0000000..4225749
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html
@@ -0,0 +1,38 @@
+<div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{customModalCtrl.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <label for="cpid" class="control-label col-sm-2">Custom: </label>
+ <table cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td>
+ <div class="col-sm-12">
+ <input type="text" class="form-control" ng-model="customModalCtrl.custom"/>
+ <p class="help-block">
+ Please separate multiple customs with space or comma
+ </p>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="customModalCtrl.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{customModalCtrl.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="customModalCtrl.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="customModalCtrl.cancel()">Cancel</button>
+ </div>
+ </div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/installerModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/installerModal.html
new file mode 100644
index 0000000..4be1375
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/installerModal.html
@@ -0,0 +1,59 @@
+<div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{installerModalCtrl.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label col-sm-2"> Name: </label>
+ </div>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="installerModalCtrl.installer.installer"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label col-sm-2"> Version: </label>
+ </div>
+ <div class="col-sm-6">
+ <button class="btn btn-primary" ng-click="installerModalCtrl.openVersionModal()">Add&nbsp;Version</button>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ <div class='clo-md-12' style="padding-right:0px">
+ <h3>Version</h3>
+ <div class="table-responsive">
+ <table class="table table-bordered table-hover" ng-data="installerModalCtrl.installer.versions">
+ <thead>
+ <tr style="
+ text-align: center;">
+ <th style="width: 19%;">Version</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat-start="(index, version) in installerModalCtrl.installer.versions" style="padding:9px">
+ <td>{{version.version}}</td>
+ </tr>
+ <tr ng-repeat-end=>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="installerModalCtrl.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{installerModalCtrl.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="installerModalCtrl.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="installerModalCtrl.cancel()">Cancel</button>
+ </div>
+ </div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/projectModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/projectModal.html
new file mode 100644
index 0000000..171cc33
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/projectModal.html
@@ -0,0 +1,59 @@
+<div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{projectModalCtrl.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label"> Project&nbsp;Name: </label>
+ </div>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="projectModalCtrl.project.project"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label"> Custom: </label>
+ </div>
+ <div class="col-sm-6">
+ <button class="btn btn-primary" ng-click="projectModalCtrl.openCustomModal()">Add&nbsp;Custom</button>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ <div class='clo-md-12' style="padding-right:0px">
+ <h3>Customs</h3>
+ <div class="table-responsive">
+ <table class="table table-bordered table-hover" ng-data="projectModalCtrl.project.customs">
+ <thead>
+ <tr style="
+ text-align: center;">
+ <th style="width: 1%;">Custom</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat-start="custom in projectModalCtrl.project.customs" style="padding:9px">
+ <td>{{custom}}</td>
+ </tr>
+ <tr ng-repeat-end=>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="projectModalCtrl.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{projectModalCtrl.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="projectModalCtrl.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="projectModalCtrl.cancel()">Cancel</button>
+ </div>
+ </div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioModal.html
new file mode 100644
index 0000000..2b5ba9e
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioModal.html
@@ -0,0 +1,59 @@
+<div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{scenarioModalController.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label col-sm-2"> Name: </label>
+ </div>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="scenarioModalController.scenario.name"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label col-sm-2"> Installer: </label>
+ </div>
+ <div class="col-sm-6">
+ <button class="btn btn-primary" ng-click="scenarioModalController.openInstallerModal()">Add&nbsp;Installer</button>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ <div class='clo-md-12' style="padding-right:0px">
+ <h3>Installers</h3>
+ <div class="table-responsive">
+ <table class="table table-bordered table-hover" ng-data="scenarioModalController.scenario">
+ <thead>
+ <tr style="
+ text-align: center;">
+ <th style="width: 19%;">Installers</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat-start="(index, installer) in scenarioModalController.scenario.installers" style="padding:9px">
+ <td>{{installer.installer}}</td>
+ </tr>
+ <tr ng-repeat-end=>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="scenarioModalController.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{scenarioModalController.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="scenarioModalController.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="scenarioModalController.cancel()">Cancel</button>
+ </div>
+</div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioNameUpdate.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioNameUpdate.html
new file mode 100644
index 0000000..e793c05
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/scenarioNameUpdate.html
@@ -0,0 +1,28 @@
+<div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{ScenarioNameUpdateCtrl.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <label for="cpid" class="control-label col-sm-4">Name: </label>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="ScenarioNameUpdateCtrl.name"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="ScenarioNameUpdateCtrl.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{ScenarioNameUpdateCtrl.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="ScenarioNameUpdateCtrl.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="ScenarioNameUpdateCtrl.cancel()">Cancel</button>
+ </div>
+ </div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/scoreModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/scoreModal.html
new file mode 100644
index 0000000..55b5cfd
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/scoreModal.html
@@ -0,0 +1,51 @@
+
+
+ <div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{scoreModalCtrl.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <label for="cpid" class="control-label col-sm-4">Score: </label>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="scoreModalCtrl.score.score"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ <div class="update-project">
+ <div>
+ <div class="col-md-4" style="text-align:right;">
+ <span style="margin-top:6px;">Date:&nbsp;&nbsp;</span>
+ </div>
+ <div class="col-md-6">
+ <p class="input-group" style="display:inline-flex;">
+ <input type="text" class="form-control"
+ uib-datepicker-popup="{{scoreModalCtrl.format}}"
+ ng-model="scoreModalCtrl.score.date" is-open="scoreModalCtrl.endOpen"
+ close-text="Close" />
+ <span class="input-group-btn">
+ <button type="button" class="btn btn-default" ng-click="scoreModalCtrl.open($event, 'endOpen')">
+ <i class="glyphicon glyphicon-calendar"></i>
+ </button>
+ </span>
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="scoreModalCtrl.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{scoreModalCtrl.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="scoreModalCtrl.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="scoreModalCtrl.cancel()">Cancel</button>
+ </div>
+ </div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/trustIndicatorModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/trustIndicatorModal.html
new file mode 100644
index 0000000..b84bd5d
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/trustIndicatorModal.html
@@ -0,0 +1,49 @@
+<div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{trustIndicatorModalCtrl.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <label for="cpid" class="control-label col-sm-4">Status: </label>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="trustIndicatorModalCtrl.ti.status"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ <div class="update-project">
+ <div>
+ <div class="col-md-4" style="text-align:right;">
+ <span style="margin-top:6px;">Date:&nbsp;&nbsp;</span>
+ </div>
+ <div class="col-md-6">
+ <p class="input-group" style="display:inline-flex;">
+ <input type="text" class="form-control"
+ uib-datepicker-popup="{{trustIndicatorModalCtrl.format}}"
+ ng-model="trustIndicatorModalCtrl.ti.date" is-open="trustIndicatorModalCtrl.endOpen"
+ close-text="Close" />
+ <span class="input-group-btn">
+ <button type="button" class="btn btn-default" ng-click="trustIndicatorModalCtrl.open($event, 'endOpen')">
+ <i class="glyphicon glyphicon-calendar"></i>
+ </button>
+ </span>
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="trustIndicatorModalCtrl.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{trustIndicatorModalCtrl.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="trustIndicatorModalCtrl.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="trustIndicatorModalCtrl.cancel()">Cancel</button>
+ </div>
+ </div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/versionModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/versionModal.html
new file mode 100644
index 0000000..f679f0b
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/versionModal.html
@@ -0,0 +1,68 @@
+<div class="ball" style="padding:5px;">
+ <div class="modal-body">
+ <div class="form-horizontal">
+ <fieldset>
+ <div class="form-group">
+ <legend>{{versionModalCtrl.data.text}}</legend>
+ <div class="row">
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label col-sm-2"> Version: </label>
+ </div>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="versionModalCtrl.version.version"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label col-sm-2"> Owner: </label>
+ </div>
+ <div class="col-sm-6">
+ <input type="text" class="form-control" ng-model="versionModalCtrl.version.owner"/>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ <div class="update-project">
+ <div class="col-sm-4">
+ <label for="cpid" class="control-label col-sm-2"> Project: </label>
+ </div>
+ <div class="col-sm-4">
+ <button class="btn btn-primary" ng-click="versionModalCtrl.openProjectModal()">Add&nbsp;Project:</button>
+ <p class="help-block"></p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </div>
+ <div class='clo-md-12' style="padding-right:0px">
+ <h3>Projects</h3>
+ <div class="table-responsive">
+ <table class="table table-bordered table-hover" ng-data="versionModalCtrl.version.projects">
+ <thead>
+ <tr style="
+ text-align: center;">
+ <th style="width: 19%;">Project</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat-start="(index, project) in versionModalCtrl.version.projects" style="padding:9px">
+ <td>{{project.project}}</td>
+ </tr>
+ <tr ng-repeat-end=>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div ng-show="versionModalCtrl.showCreateError" style="padding:0px;" class="col-md-6 alert alert-danger" role="alert">
+ <span class="pull-right">&nbsp;{{versionModalCtrl.error}}</span>
+ <span class="glyphicon glyphicon-exclamation-sign pull-right" aria-hidden="true" >Error:</span>
+ </div>
+ <button class="btn btn-primary" ng-click="versionModalCtrl.confirm()">Ok</button>
+ <button class="btn btn-default" ng-click="versionModalCtrl.cancel()">Cancel</button>
+ </div>
+ </div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/scenario/scenario.html b/testapi/opnfv_testapi/ui/components/scenarios/scenario/scenario.html
new file mode 100644
index 0000000..d6d4257
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/scenario/scenario.html
@@ -0,0 +1,234 @@
+<legend>Scenario</legend>
+<div style="padding-right:0px" class="col-md-12">
+ <div class="table-responsive">
+ <table class="table" ng-data="ctrl.data">
+ <tbody>
+ <tr style="padding:9px">
+ <td class="podsTableTd">Id&nbsp;:</td>
+ <td class="podsTableLeftTd">{{ctrl.data.scenarios[0]._id}}</td>
+ </tr>
+ <tr style="padding:9px">
+ <td class="podsTableTd">Name&nbsp;:</td>
+ <td width="90%" class="podsTableLeftTd">{{ctrl.data.scenarios[0].name}}</td>
+ </tr>
+ <tr style="padding:9px">
+ <td class="podsTableTd">Creator&nbsp;:</td>
+ <td width="90%" class="podsTableLeftTd">{{ctrl.data.scenarios[0].creator}}</td>
+ </tr>
+ <tr style="padding:9px">
+ <td class="podsTableTd">Created&nbsp;at&nbsp;:</td>
+ <td width="90%" class="podsTableLeftTd">{{ctrl.data.scenarios[0].creation_date}}</td>
+ </tr>
+ <tr style="padding:9px">
+ <td class="podsTableTd">Installers</td>
+ <td width="90%" class="podsTableLeftTd">
+ <div class="col-md-1" style="padding:0px">
+ <a ng-click="ctrl.expandInstallers()">
+ <p ng-if="ctrl.collapeInstallers">Hide</p>
+ <p ng-if="!ctrl.collapeInstallers">Show</p>
+ </a>
+ </div>
+ <div class="col-md-1" style="padding:0px" ng-class="{'hidden' : !ctrl.buttonInstaller || (!auth.isAuthenticated && authenticate)}">
+ <button type="button" class="btn btn-success btn-xs" ng-click="ctrl.openAddInstaller()" ><i class="fa fa-plus"></i>Add</button>
+ </div>
+ <div ng-class="{ 'hidden' : ! ctrl.collapeInstallers } ">
+ <div class="table-responsive">
+ <table class="table " ng-data="ctrl.data.scenarios[0].installers">
+ <tbody ng-repeat="(indexI, installer) in ctrl.data.scenarios[0].installers">
+ <tr style="padding:9px">
+ <td class="podsTableTd">
+ {{indexI+1}}.&nbsp;Installer:&nbsp;
+ </td>
+ <td class="podsTableLeftTd" style="width:10%;padding-top: 7px;">
+ <a ng-click="ctrl.expandInstaller(indexI)">{{installer.installer}}</a>
+ </td>
+ <td style="width:80%;border: none; padding: 0px;" ng-class="{'hidden' : !ctrl.buttonInstaller}">
+ <button type="button" ng-class="{'hidden' : !auth.isAuthenticated && authenticate}" class="btn btn-danger btn-xs" ng-click="ctrl.openDeleteInstallerModal(installer.installer)" ><i class="fa fa-minus"></i>Delete</button>
+ </td>
+ </tr>
+ <tr ng-class="{ 'hidden' : ! ctrl.collapeInstaller[indexI] }">
+ <td class="podsTableTd">
+ Versions:
+ </td>
+ <td width="90%" class="podsTableLeftTd">
+ <div class="col-md-1" style="padding:0px">
+ <a ng-click="ctrl.expandVersions(indexI)">
+ <p ng-if="ctrl.collapeVersions[indexI]">Hide</p>
+ <p ng-if="!ctrl.collapeVersions[indexI]">Show</p>
+ </a>
+ </div>
+ <div class="col-md-1" style="padding:0px" ng-class="{'hidden' : !ctrl.buttonVersion}">
+ <button type="button" class="btn btn-success btn-xs" ng-class="{'hidden' : !auth.isAuthenticated && authenticate}" ng-click="ctrl.openAddVersionModal(installer.installer)" ><i class="fa fa-plus"></i>Add</button>
+ </div>
+ <div ng-class="{ 'hidden' : ! ctrl.collapeVersions[indexI] } " class="col-md-12">
+ <div class="table-responsive">
+ <table class="table " ng-data="inctrl.data.scenarios[0].installers">
+ <tbody ng-repeat="(indexV, version) in installer.versions">
+ <tr style="padding:9px">
+ <td class="podsTableTd">
+ {{indexV+1}}.&nbsp;Version:
+ </td>
+ <td class="podsTableLeftTd" style="width:10%;padding-top: 7px;">
+ <a ng-click="ctrl.expandVersion(indexI,indexV)">{{version.version}}</a>
+ </td>
+ <td style="width:80%;border: none; padding: 0px;" ng-class="{'hidden' : !ctrl.buttonVersion}">
+ <button type="button" class="btn btn-danger btn-xs" ng-class="{'hidden' : !auth.isAuthenticated && authenticate}" ng-click="ctrl.openDeleteVersionModal(version.version, installer.installer)" ><i class="fa fa-minus"></i>Delete</button>
+ </td>
+ </tr>
+ <tr style="padding:9px" ng-class="{ 'hidden' : ! ctrl.collapeVersion[indexI][indexV] } ">
+ <td class="podsTableTd">
+ Owner:
+ </td>
+ <td class="podsTableLeftTd" style="width:90%">{{version.owner}}</td>
+ </tr>
+ <tr style="padding:9px" ng-class="{ 'hidden' : ! ctrl.collapeVersion[indexI][indexV] }">
+ <td class="podsTableTd">
+ Projects:
+ </td>
+ <td width="90%" class="podsTableLeftTd">
+ <div class="col-md-1" style="padding:0px">
+ <a ng-click="ctrl.expandProjects(indexI,indexV)">
+ <p style="width:50%" ng-if="ctrl.collapeProjects[indexI][indexV]">Hide</p>
+ <p style="width:50%" ng-if="!ctrl.collapeProjects[indexI][indexV]">Show</p>
+ </a>
+ </div>
+ <div class="col-md-1" style="padding:0px" ng-class="{'hidden' : !ctrl.buttonProject }">
+ <button type="button" ng-class="{'hidden' : !auth.isAuthenticated && authenticate}" class="btn btn-success btn-xs" ng-click="ctrl.openAddProjectModal(version.version,installer.installer)" ><i class="fa fa-plus"></i>Add</button>
+ </div>
+ <div ng-class="{ 'hidden' : ! ctrl.collapeProjects[indexI][indexV] } " class="col-md-12">
+ <div class="table-responsive">
+ <table class="table " ng-data="version.projects">
+ <tbody ng-repeat="(indexP, project) in version.projects" >
+ <tr style="padding:9px">
+ <td class="podsTableTd">
+ {{indexP+1}}.&nbsp;Project:
+ </td>
+ <td class="podsTableLeftTd" style="width:10%;padding-top: 7px;">
+ <a ng-click="ctrl.expandProject(indexI, indexV, indexP)">{{project.project}}</a>
+ </td>
+ <td style="width:80%;border: none; padding: 0px;" ng-class="{'hidden' : !ctrl.buttonProject}">
+ <button type="button" class="btn btn-danger btn-xs" ng-class="{'hidden' : !auth.isAuthenticated && authenticate}" ng-click="ctrl.openDeleteProjectModal(project,version.version, installer.installer)" ><i class="fa fa-minus"></i>Delete</button>
+ </td>
+ </tr>
+ <tr ng-class="{ 'hidden' : ! ctrl.collapeProject[indexI][indexV][indexP] }">
+ <td class="podsTableTd">
+ Trust&nbsp;Indicators:
+ </td>
+ <td class="podsTableLeftTd" style="width:90%">
+ <a ng-click="ctrl.expandTrustIndicator(indexI, indexV, indexP)">
+ <p ng-if="ctrl.collapeTrustIndicator[indexI][indexV][indexP]">Hide</p>
+ <p ng-if="!ctrl.collapeTrustIndicator[indexI][indexV][indexP]">Show</p>
+ </a>
+ <table class="table " ng-class="{ 'hidden' : ! ctrl.collapeTrustIndicator[indexI][indexV][indexP] } " ng-data="project.trust_indicators">
+ <tbody ng-repeat="(indexTI, trust_indicator) in project.trust_indicators" >
+ <tr style="padding:9px">
+ <td class="podsTableTd">
+ Status:&nbsp;
+ </td>
+ <td width="90%" class="podsTableLeftTd">
+ {{trust_indicator.status}}
+ </td>
+ </tr>
+ <tr style="padding:9px">
+ <td class="podsTableTd">
+ Date:&nbsp;
+ </td>
+ <td width="90%" class="podsTableLeftTd">
+ {{trust_indicator.date}}
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr ng-class="{ 'hidden' : ! ctrl.collapeProject[indexI][indexV][indexP] }">
+ <td class="podsTableTd">
+ Scores:
+ </td>
+ <td class="podsTableLeftTd" style="width:90%">
+ <a ng-click="ctrl.expandScore(indexI, indexV, indexP)">
+ <p ng-if="ctrl.collapeScore[indexI][indexV][indexP]">Hide</p>
+ <p ng-if="!ctrl.collapeScore[indexI][indexV][indexP]">Show</p>
+ </a>
+ <table class="table" ng-class="{ 'hidden' : ! ctrl.collapeScore[indexI][indexV][indexP] } " ng-data="project.scores">
+ <tbody ng-repeat="(indexSC, score) in project.scores" >
+ <tr style="padding:9px">
+ <td class="podsTableTd">
+ Score:&nbsp;
+ </td>
+ <td width="90%" class="podsTableLeftTd">
+ {{score.score}}
+ </td>
+ </tr>
+ <tr style="padding:9px">
+ <td class="podsTableTd">
+ Date:&nbsp;
+ </td>
+ <td width="90%" class="podsTableLeftTd">
+ {{score.date}}
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr ng-class="{ 'hidden' : ! ctrl.collapeProject[indexI][indexV][indexP] }">
+ <td class="podsTableTd">
+ Customs:
+ </td>
+ <td class="podsTableLeftTd" style="width:90%">
+ <a ng-click="ctrl.expandCustom(indexI, indexV, indexP)">
+ <p ng-if="ctrl.collapeCustom[indexI][indexV][indexP]">Hide</p>
+ <p ng-if="!ctrl.collapeCustom[indexI][indexV][indexP]">Show</p>
+ </a>
+ <table class="table" ng-class="{ 'hidden' : ! ctrl.collapeCustom[indexI][indexV][indexP] } " ng-data="project.customs">
+ <tbody>
+ <tr ng-repeat-start="(indexCU, custom) in project.customs" style="padding:9px">
+ <td class="podsTableTd" style="float: none!important;">
+ {{custom}}
+ </td>
+ <td width="90%" class="podsTableLeftTd">
+ <button type="button" class="btn btn-danger btn-xs" ng-click="ctrl.openDeleteCustomModal(custom,project.project,version.version,installer.installer)" ng-class="{'hidden' : !auth.isAuthenticated && authenticate}" ><i class="fa fa-minus"></i>Delete</button>
+ </td>
+ </tr>
+ <tr ng-repeat-end=>
+ </tr>
+ <tr>
+ <button type="button" class="btn btn-success btn-xs" ng-click="ctrl.openAddCustomModal(project.project,version.version,installer.installer)" ng-class="{ 'hidden' : !ctrl.collapeCustom[indexI][indexV][indexP] || (!auth.isAuthenticated && authenticate)}"><i class="fa fa-plus"></i>Add</button>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr ng-repeat-end=>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+<div class="row" style="margin-bottom:24px;"></div>
+<div ng-class="{'show': ctrl.showError}" id="toast" class="error">
+ <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true" ></span>
+ {{ctrl.error}}</div>
+<div ng-class="{'show': ctrl.showSuccess}" id="toast" class="success">
+ <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
+ {{ctrl.success}}</div>
+<div class="row" style="margin-bottom:24px;"></div> \ No newline at end of file
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/scenario/scenarioController.js b/testapi/opnfv_testapi/ui/components/scenarios/scenario/scenarioController.js
new file mode 100644
index 0000000..e17718f
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/scenario/scenarioController.js
@@ -0,0 +1,605 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function () {
+ 'use strict';
+
+ angular
+ .module('testapiApp')
+ .controller('ScenarioController', ScenarioController);
+
+ ScenarioController.$inject = [
+ '$scope', '$http', '$filter', '$state', '$window', '$uibModal', 'testapiApiUrl','raiseAlert',
+ 'confirmModal', 'authenticate', '$timeout'
+ ];
+
+ /**
+ * TestAPI Scenario Controller
+ * This controller is for the '/Scenario/:name' page where a user can browse
+ * through Scenario declared in TestAPI.
+ */
+ function ScenarioController($scope, $http, $filter, $state, $window, $uibModal, testapiApiUrl,
+ raiseAlert, confirmModal, authenticate, $timeout) {
+ var ctrl = this;
+ ctrl.name = $state.params['name'];
+ ctrl.url = testapiApiUrl + '/scenarios?name=' + ctrl.name;
+ ctrl.expandInstallers = expandInstallers;
+ ctrl.expandInstaller = expandInstaller;
+ ctrl.expandInstaller = ctrl.expandInstaller;
+ ctrl.expandVersion = expandVersion;
+ ctrl.expandVersions = expandVersions;
+ ctrl.loadDetails = loadDetails;
+ ctrl.expandProjects = expandProjects
+ ctrl.expandProject = expandProject
+ ctrl.expandTrustIndicator = expandTrustIndicator;
+ ctrl.expandScore = expandScore;
+ ctrl.expandCustom = expandCustom;
+ ctrl.collapeVersion = [];
+ ctrl.collapeVersions = [];
+ ctrl.collapeProjects = [];
+ ctrl.collapeProject = [];
+ ctrl.collapeTrustIndicator = [];
+ ctrl.collapeScore = [];
+ ctrl.collapeCustom = [];
+ ctrl.collapeInstaller = [];
+ ctrl.addCustom = addCustom;
+ ctrl.openAddCustomModal = openAddCustomModal;
+ ctrl.openDeleteCustomModal = openDeleteCustomModal;
+ ctrl.deleteCustom = deleteCustom;
+ ctrl.addProject = addProject
+ ctrl.openAddProjectModal = openAddProjectModal
+ ctrl.openAddVersionModal = openAddVersionModal
+ ctrl.addVersion = addVersion
+ ctrl.openDeleteVersionModal = openDeleteVersionModal
+ ctrl.deleteVersion = deleteVersion
+ ctrl.openAddInstaller = openAddInstaller
+ ctrl.addInstaller = addInstaller
+ ctrl.openDeleteInstallerModal = openDeleteInstallerModal
+ ctrl.deleteInstaller = deleteInstaller
+ ctrl.openDeleteProjectModal = openDeleteProjectModal
+ ctrl.deleteProject = deleteProject
+
+ ctrl.buttonInstaller = true
+ ctrl.buttonVersion = true
+ ctrl.buttonProject = true
+ ctrl.toastError = toastError
+ ctrl.toastSuccess = toastSuccess
+
+ function toastError() {
+ ctrl.showError = true
+ $timeout(function(){ ctrl.showError = false;}, 3000);
+ }
+
+ function toastSuccess() {
+ ctrl.showSuccess = true
+ $timeout(function(){ ctrl.showSuccess = false;}, 3000);
+ }
+ /**
+ * This will contact the TestAPI to get a listing of declared projects.
+ */
+ function loadDetails() {
+ ctrl.showError = false;
+ ctrl.projectsRequest =
+ $http.get(ctrl.url).success(function (data) {
+ ctrl.data = data;
+ }).catch(function (error) {
+ ctrl.data = null;
+ ctrl.error = error.statusText
+ ctrl.toastError()
+ });
+ }
+
+ function expandTrustIndicator(indexI, indexV, indexP){
+ if(ctrl.collapeTrustIndicator[indexI]==undefined){
+ ctrl.collapeTrustIndicator[indexI] = []
+ if(ctrl.collapeTrustIndicator[indexI][indexV]==undefined){
+ ctrl.collapeTrustIndicator[indexI][indexV] = []
+ }
+ }
+ if(ctrl.collapeTrustIndicator[indexI][indexV][indexP]){
+ ctrl.collapeTrustIndicator[indexI][indexV][indexP] = false;
+ }else{
+ ctrl.collapeTrustIndicator[indexI][indexV][indexP] = true;
+ }
+ }
+
+ function expandScore(indexI, indexV, indexP){
+ if(ctrl.collapeScore[indexI]==undefined){
+ ctrl.collapeScore[indexI] = []
+ if(ctrl.collapeScore[indexI][indexV]==undefined){
+ ctrl.collapeScore[indexI][indexV] = []
+ }
+ }
+ if(ctrl.collapeScore[indexI][indexV][indexP]){
+ ctrl.collapeScore[indexI][indexV][indexP] = false;
+ }else{
+ ctrl.collapeScore[indexI][indexV][indexP] = true;
+ }
+ }
+
+ function expandCustom(indexI, indexV, indexP){
+ if(ctrl.collapeCustom[indexI]==undefined){
+ ctrl.collapeCustom[indexI] = []
+ if(ctrl.collapeCustom[indexI][indexV]==undefined){
+ ctrl.collapeCustom[indexI][indexV] = []
+ }
+ }
+ if(ctrl.collapeCustom[indexI][indexV][indexP]){
+ ctrl.collapeCustom[indexI][indexV][indexP] = false;
+ ctrl.buttonProject = true
+ }else{
+ ctrl.collapeCustom[indexI][indexV][indexP] = true;
+ ctrl.buttonProject = false
+ }
+ }
+
+ function expandVersion(indexI, indexV){
+ if(ctrl.collapeVersion[indexI]==undefined){
+ ctrl.collapeVersion[indexI] = []
+ }
+ if(ctrl.collapeVersion[indexI][indexV]){
+ ctrl.collapeVersion[indexI][indexV] = false;
+ }else{
+ ctrl.collapeVersion[indexI][indexV] = true;
+ }
+ }
+
+ function expandVersions(index){
+ if(ctrl.collapeVersions[index]){
+ ctrl.collapeVersions[index] = false;
+ ctrl.buttonInstaller = true
+ }else{
+ ctrl.collapeVersions[index] = true;
+ ctrl.buttonInstaller = false
+ }
+ }
+
+ function expandProjects(indexI, indexV){
+ if(ctrl.collapeProjects[indexI]==undefined){
+ ctrl.collapeProjects[indexI] = []
+ }
+ if(ctrl.collapeProjects[indexI][indexV]){
+ ctrl.collapeProjects[indexI][indexV] = false;
+ ctrl.buttonVersion = true
+ }
+ else{
+ ctrl.collapeProjects[indexI][indexV]= true;
+ ctrl.buttonVersion = false
+ }
+ }
+
+ function expandProject(indexI, indexV, indexP){
+ if(ctrl.collapeProject[indexI]==undefined){
+ ctrl.collapeProject[indexI] = []
+ if(ctrl.collapeProject[indexI][indexV]==undefined){
+ ctrl.collapeProject[indexI][indexV] = []
+ }
+ }
+ if(ctrl.collapeProject[indexI][indexV][indexP]){
+ ctrl.collapeProject[indexI][indexV][indexP] = false;
+ }
+ else{
+ ctrl.collapeProject[indexI][indexV][indexP]= true;
+ }
+ }
+
+ function expandInstaller(index){
+ if(ctrl.collapeInstaller[index]){
+ ctrl.collapeInstaller[index] = false;
+ }
+ else{
+ ctrl.collapeInstaller[index]= true;
+ }
+ }
+
+ function expandInstallers(){
+ if(ctrl.collapeInstallers){
+ ctrl.collapeInstallers= false
+ }else{
+ ctrl.collapeInstallers= true
+ }
+ }
+
+ function deleteInstaller(data){
+ ctrl.installerReqest = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/installers"
+ $http.delete(ctrl.installerReqest, {data: data.installers, headers: {'Content-Type': 'application/json'}}).success(function (data){
+ ctrl.success = "Installer is successfully deleted."
+ ctrl.toastSuccess();
+ ctrl.loadDetails();
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError()
+ });
+ }
+
+ function openDeleteInstallerModal(installer){
+ var installers = []
+ installers.push(installer)
+ var data = {
+ "installers": installers
+ }
+ confirmModal("Delete", 'installers', ctrl.deleteInstaller, data);
+ }
+
+ function addInstaller(installer){
+ var installers = []
+ installers.push(installer)
+ ctrl.installerRequestUrl = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/installers"
+ ctrl.installerRequest = $http.post(ctrl.installerRequestUrl, installers)
+ ctrl.installerRequest.success(function (data){
+ ctrl.success = "Installers are successfully updated."
+ ctrl.loadDetails();
+ ctrl.toastSuccess();
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ return ctrl.installerRequest
+ }
+
+ function openAddInstaller(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/installerModal.html',
+ controller: 'installerModalCtrl as installerModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Add Installer",
+ successHandler: ctrl.addInstaller
+ };
+ }
+ }
+ });
+ }
+
+ function addVersion(versions, installer){
+ ctrl.versionRequestUrl = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/versions?installer="+installer
+ ctrl.versionRequest = $http.post(ctrl.versionRequestUrl, versions)
+ ctrl.versionRequest.success(function (data){
+ ctrl.success = "Versions are successfully updated."
+ ctrl.loadDetails();
+ ctrl.toastSuccess()
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError()
+ });
+ return ctrl.versionRequest;
+ }
+
+ function openDeleteVersionModal(version, installer){
+ var versions = []
+ versions.push(version)
+ var data = {
+ "version": versions,
+ "installer": installer
+ }
+ confirmModal("Delete", "version", ctrl.deleteVersion, data);
+ }
+
+ function deleteVersion(data){
+ ctrl.versionReqest = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/versions?installer="+data.installer
+ $http.delete(ctrl.versionReqest, {data: data.version, headers: {'Content-Type': 'application/json'}}).success(function (data){
+ ctrl.success = "Versions are successfully deleted."
+ ctrl.loadDetails();
+ ctrl.toastSuccess();
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ }
+
+ function openAddVersionModal(installer){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/versionModal.html',
+ controller: 'versionAddModalCtrl as versionModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Add Version",
+ successHandler: ctrl.addVersion,
+ installer: installer
+ };
+ }
+ }
+ });
+ }
+
+ function addProject(project, version, installer){
+ ctrl.projectRequestUrl = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/projects?installer="+installer+"&version="+version
+ ctrl.projectRequest= $http.post(ctrl.projectRequestUrl, project)
+ ctrl.projectRequest.success(function (data){
+ ctrl.success = "Projects are successfully updated."
+ ctrl.loadDetails();
+ ctrl.toastSuccess();
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ return ctrl.projectRequest;
+ }
+
+ function openAddProjectModal(version, installer){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/projectModal.html',
+ controller: 'projectAddModalCtrl as projectModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Add Project",
+ successHandler: ctrl.addProject,
+ version: version,
+ installer: installer
+ };
+ }
+ }
+ });
+ }
+
+ function addCustom(custom,project,version,installer){
+ ctrl.customRequestUrl = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/customs?installer="+installer+"&version="+version+"&project="+ project
+ ctrl.customRequest = $http.post(ctrl.customRequestUrl, custom)
+ ctrl.customRequest.success(function (data){
+ ctrl.success = "Customs are successfully updated."
+ ctrl.loadDetails();
+ ctrl.toastSuccess();
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ return ctrl.customRequest
+ }
+
+ function openDeleteCustomModal(custom,project,version,installer){
+ var customs = []
+ customs.push(custom)
+ var data = {
+ "customs": customs,
+ "project": project,
+ "version": version,
+ "installer": installer
+ }
+ confirmModal("Delete", 'customs', ctrl.deleteCustom, data);
+ }
+
+ function deleteCustom(data){
+ ctrl.customReqest = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/customs?installer="+data.installer+"&version="+data.version+"&project="+ data.project
+ $http.delete(ctrl.customReqest, {data: data.customs, headers: {'Content-Type': 'application/json'}}).success(function (data){
+ ctrl.success = "Customs are successfully deleted."
+ ctrl.loadDetails();
+ ctrl.toastSuccess();
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ }
+
+ function openAddCustomModal(project,version,installer){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/customModal.html',
+ controller: 'customAddModalCtrl as customModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Add Custom",
+ successHandler: ctrl.addCustom,
+ project: project,
+ version: version,
+ installer: installer
+ };
+ }
+ }
+ });
+ }
+
+ function openDeleteProjectModal(project, version, installer){
+ var projects = []
+ projects.push(project.project)
+ var data = {
+ "projects": projects,
+ "version": version,
+ "installer": installer
+ }
+ confirmModal("Delete", 'projects', ctrl.deleteProject, data);
+ }
+
+ function deleteProject(data){
+ ctrl.projectReqest = testapiApiUrl+ "/scenarios/"+ ctrl.name + "/projects?installer="+data.installer+"&version="+data.version
+ $http.delete(ctrl.projectReqest, {data: data.projects, headers: {'Content-Type': 'application/json'}}).success(function (data){
+ ctrl.success = "Projects are successfully Deleted.";
+ ctrl.toastSuccess();
+ ctrl.loadDetails();
+ })
+ .catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ }
+
+ ctrl.loadDetails();
+ }
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('customAddModalCtrl', customAddModalCtrl);
+ customAddModalCtrl.$inject = ['$scope', '$uibModalInstance', 'data'];
+ function customAddModalCtrl($scope, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+
+ ctrl.customs = [];
+
+ function confirm() {
+ var custom = ctrl.custom;
+ if(custom!="" && custom!=undefined ){
+ ctrl.customs = custom.split(/[ ,]+/).filter(Boolean);
+ }
+ console.log(ctrl.customs)
+ ctrl.data.successHandler(
+ ctrl.customs, ctrl.data.project,
+ ctrl.data.version,ctrl.data.installer).success(function(){
+ $uibModalInstance.dismiss('cancel');
+ });
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+ }
+
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('projectAddModalCtrl', projectAddModalCtrl);
+ projectAddModalCtrl.$inject = ['$scope', '$uibModal', '$uibModalInstance', 'data'];
+ function projectAddModalCtrl($scope, $uibModal, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.openCustomModal = openCustomModal;
+ ctrl.handleModalCustom = handleModalCustom;
+ ctrl.projects = []
+ ctrl.project = {
+ "scores": [],
+ "trust_indicators": [],
+ "customs": []
+ }
+
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+ ctrl.projects.push(ctrl.project)
+ ctrl.data.successHandler(
+ ctrl.projects, ctrl.data.version, ctrl.data.installer).success( function(){
+ $uibModalInstance.dismiss('cancel');
+ });
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+
+ function handleModalCustom(custom){
+ ctrl.project.customs.push(custom);
+ }
+
+ function openCustomModal(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/customModal.html',
+ controller: 'customModalCtrl as customModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Custom",
+ successHandler: ctrl.handleModalCustom
+ };
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('versionAddModalCtrl', versionAddModalCtrl);
+ versionAddModalCtrl.$inject = ['$scope', '$uibModal','$uibModalInstance', 'data'];
+ function versionAddModalCtrl($scope, $uibModal, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.openProjectModal = openProjectModal;
+ ctrl.handleModalData = handleModalData;
+ ctrl.versions = []
+ ctrl.version = {
+ "projects": []
+ }
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+ ctrl.versions.push(ctrl.version)
+ ctrl.data.successHandler(ctrl.versions, ctrl.data.installer).success(function(){
+ $uibModalInstance.dismiss('cancel');
+ });
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+
+ function handleModalData(project){
+ ctrl.version.projects.push(project)
+ }
+ function openProjectModal(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/projectModal.html',
+ controller: 'projectModalCtrl as projectModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Project",
+ successHandler: ctrl.handleModalData,
+ };
+ }
+ }
+ });
+ }
+ }
+
+})();
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/scenarios.html b/testapi/opnfv_testapi/ui/components/scenarios/scenarios.html
new file mode 100644
index 0000000..8d23449
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/scenarios.html
@@ -0,0 +1,63 @@
+<h3>Scenarios</h3>
+<div class="row" style="margin-bottom:24px;"></div>
+<div class="row podsTable" style="vertical-align:middle">
+ <div class="col-sm-1 pull-right" ng-class="{ 'hidden': !auth.isAuthenticated }" >
+ <button type="button" class="btn btn-danger" ng-click="ctrl.openBatchDeleteModal()">
+ <i class="fa fa-minus"></i> Delete</button>
+ </div>
+ <div class="col-sm-2 pull-right" ng-class="{ 'hidden': !auth.isAuthenticated}">
+ <button type="button" class="btn btn-success" ng-click="ctrl.openScenarioModal()">
+ <i class="fa fa-plus"></i>Create</button>
+ </div>
+</div>
+<div ng-class="{'show': ctrl.showError}" id="toast" class="error">
+ <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true" ></span>
+ {{ctrl.error}}</div>
+<div ng-class="{'show': ctrl.showSuccess}" id="toast" class="success">
+ <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
+ {{ctrl.success}}</div>
+<div class='clo-md-12' style="padding-right:0px">
+ <div class="table-responsive">
+ <table class="table table-bordered table-hover" ng-data="ctrl.data.scenarios">
+ <thead>
+ <tr style="
+ text-align: center;">
+ <th style="width: 1%;">Bulk&nbsp;Select</th>
+ <th style="width: 80%;">Name
+ <a class="text-danger" ng-click="ctrl.sortBy()" ng-class="{ 'hidden': ctrl.sortName }" >
+ <span class="glyphicon glyphicon-sort-by-alphabet pull-right" aria-hidden="true"></span>
+ </a>
+ <a class="text-danger" ng-click="ctrl.sortBy()" ng-class="{ 'hidden': !ctrl.sortName}" >
+ <span class="glyphicon glyphicon-sort-by-alphabet-alt pull-right" aria-hidden="true"></span>
+ </a>
+ </th>
+ <th style="width: 19%;" ng-class="{'hidden': !auth.isAuthenticated}">Operations</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat-start="(index, scenario) in ctrl.data.scenarios" style="padding:9px">
+ <td>
+ <div class="text-center">
+ <input type="checkbox" value="{{scenario.name}}" ng-model="ctrl.checkBox[index]" >
+ </div>
+ </td>
+ <td>
+ <a class="text-info" ng-click="ctrl.viewScenario(scenario.name)">
+ {{scenario.name}}
+ </a>
+ </td>
+ <td ng-class="{'hidden': !auth.isAuthenticated}">
+ <span class="podsTable-col">
+ <a class="text-warning" ng-click="ctrl.openUpdateModal(scenario.name)" title="Edit">
+ <i class="fa fa-pencil-square-o"></i></a>
+ <a class="text-danger" ng-click="ctrl.openDeleteModal(scenario.name)" title="Delete">
+ <i class="fa fa-trash-o"></i></a>
+ </span>
+ </td>
+ <tr ng-repeat-end=>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
+
diff --git a/testapi/opnfv_testapi/ui/components/scenarios/scenariosController.js b/testapi/opnfv_testapi/ui/components/scenarios/scenariosController.js
new file mode 100644
index 0000000..0aa5bf0
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/scenarios/scenariosController.js
@@ -0,0 +1,513 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function () {
+ 'use strict';
+
+ angular
+ .module('testapiApp')
+ .controller('ScenariosController', ScenariosController);
+
+ ScenariosController.$inject = [
+ '$scope', '$http', '$filter', '$state', '$window', '$uibModal', 'testapiApiUrl',
+ 'raiseAlert', 'confirmModal', 'sortService', '$timeout'
+ ];
+
+ /**
+ * TestAPI Project Controller
+ * This controller is for the '/projects' page where a user can browse
+ * through projects declared in TestAPI.
+ */
+ function ScenariosController($scope, $http, $filter, $state, $window, $uibModal, testapiApiUrl,
+ raiseAlert, confirmModal, sortService, $timeout) {
+ var ctrl = this;
+ ctrl.url = testapiApiUrl + '/scenarios';
+
+ ctrl.createScenario = createScenario;
+ ctrl.listScenarios = listScenarios;
+ ctrl.openScenarioModal = openScenarioModal;
+ ctrl.viewScenario = viewScenario;
+ ctrl.openUpdateModal = openUpdateModal;
+ ctrl.updateScenarioName = updateScenarioName;
+ ctrl.openDeleteModal = openDeleteModal;
+ ctrl.deleteScenario = deleteScenario;
+ ctrl.openBatchDeleteModal = openBatchDeleteModal;
+ ctrl.deleteBatchScenario = deleteBatchScenario
+ ctrl.sortBy = sortBy
+ ctrl.checkBox = [];
+ ctrl.sortName = false
+ ctrl.toastError = toastError
+ ctrl.toastSuccess = toastSuccess
+
+ function toastError() {
+ ctrl.showError = true
+ $timeout(function(){ ctrl.showError = false;}, 3000);
+ }
+
+ function toastSuccess() {
+ ctrl.showSuccess = true
+ $timeout(function(){ ctrl.showSuccess = false;}, 3000);
+ }
+
+ function openUpdateModal(name){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/scenarioNameUpdate.html',
+ controller: 'ScenarioNameUpdateCtrl as ScenarioNameUpdateCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Name Change: Scenario",
+ successHandler: ctrl.updateScenarioName,
+ name: name
+ };
+ }
+ }
+ });
+ }
+
+ function openDeleteModal(name){
+ confirmModal("Delete", 'scenarios', ctrl.deleteScenario,name);
+ }
+
+ function sortBy(){
+ ctrl.data.scenarios = sortService.sortFunction(ctrl.data.scenarios, 'name' , ctrl.sortName)
+ ctrl.sortName=!ctrl.sortName
+ }
+
+ function deleteScenario(name){
+ var scenarioURL = ctrl.url+"/"+name;
+ ctrl.scenarioRequest =
+ $http.delete(scenarioURL).success(function (data){
+ ctrl.success = "Scenario is successfully deleted.";
+ ctrl.listScenarios();
+ ctrl.toastSuccess();
+ }).catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError()
+ });
+ }
+
+ function openBatchDeleteModal(){
+ var deleteObjects = []
+ ctrl.checkBox.forEach(function(scenario, index){
+ if(!ctrl.showError){
+ if(scenario){
+ deleteObjects.push(ctrl.data.scenarios[index].name);
+ }
+ }
+ });
+ confirmModal("Delete", 'scenarios', ctrl.deleteBatchScenario, deleteObjects);
+ }
+
+ function deleteBatchScenario(){
+ var index;
+ var checkedBox = [];
+ ctrl.checkBox.forEach(function(scenario, index){
+ if(!ctrl.showError){
+ if(scenario){
+ deleteScenario(ctrl.data.scenarios[index].name);
+ }
+ }
+ });
+ ctrl.checkBox = []
+ }
+
+ function updateScenarioName(newName, name){
+ var scenarioURL = ctrl.url+"/"+name
+ var body = {
+ "name": newName
+ }
+ if(newName){
+ ctrl.scenarioRequest = $http.put(scenarioURL, body)
+ ctrl.scenarioRequest.success(function (data){
+ ctrl.success = "Scenario is successfully Updated."
+ ctrl.listScenarios();
+ ctrl.toastSuccess();
+ }).catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ return ctrl.scenarioRequest
+ }else{
+ ctrl.error = "Name is missing";
+ ctrl.toastError();
+ }
+ }
+
+ function viewScenario(name){
+ $state.go('scenario', {'name':name}, {reload: true});
+ }
+
+ function createScenario(scenario) {
+ ctrl.scenarioRequest = $http.post(ctrl.url, scenario)
+
+ ctrl.scenarioRequest.success(function (data){
+ ctrl.success = "Scenario is successfully created.";
+ ctrl.toastSuccess();
+ }).catch(function (data) {
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+
+ return ctrl.scenarioRequest;
+ }
+
+ function listScenarios() {
+ ctrl.showError = false;
+ ctrl.resultsRequest =
+ $http.get(ctrl.url).success(function (data) {
+ ctrl.data = data;
+ ctrl.sortBy()
+ }).catch(function (data) {
+ ctrl.data = null;
+ ctrl.error = data.statusText;
+ ctrl.toastError();
+ });
+ }
+
+ function openScenarioModal(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/scenarioModal.html',
+ controller: 'scenarioModalController as scenarioModalController',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Scenario",
+ successHandler: ctrl.createScenario,
+ };
+ }
+ }
+ });
+ }
+
+ listScenarios();
+ }
+
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('scenarioModalController', scenarioModalController);
+ scenarioModalController.$inject = ['$scope', '$uibModal', '$uibModalInstance', 'data', '$q'];
+ function scenarioModalController($scope, $uibModal, $uibModalInstance, data, $q) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.handleModalData = handleModalData;
+ ctrl.openInstallerModal = openInstallerModal;
+ ctrl.scenario = {
+ "installers": [],
+ }
+
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+ ctrl.data.successHandler(ctrl.scenario).success(function(){
+ $uibModalInstance.dismiss('cancel');
+ });
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+
+ function handleModalData(installer){
+ ctrl.scenario.installers.push(installer)
+ var deferred = $q.defer();
+ deferred.resolve();
+ return deferred.promise;
+ }
+
+ function openInstallerModal(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/installerModal.html',
+ controller: 'installerModalCtrl as installerModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Installer",
+ successHandler: ctrl.handleModalData,
+ };
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('installerModalCtrl', installerModalCtrl);
+ installerModalCtrl.$inject = ['$scope', '$uibModal', '$uibModalInstance', 'data'];
+ function installerModalCtrl($scope, $uibModal, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.openVersionModal = openVersionModal;
+ ctrl.handleModalData = handleModalData;
+ ctrl.installer = {
+ "versions":[]
+ }
+
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+ ctrl.data.successHandler(ctrl.installer).success(function(){
+ $uibModalInstance.dismiss('cancel');
+ });
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+
+ function handleModalData(version){
+ ctrl.installer.versions.push(version);
+ }
+
+ function openVersionModal(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/versionModal.html',
+ controller: 'versionModalCtrl as versionModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Version",
+ successHandler: ctrl.handleModalData,
+ };
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('versionModalCtrl', versionModalCtrl);
+ versionModalCtrl.$inject = ['$scope', '$uibModal','$uibModalInstance', 'data'];
+ function versionModalCtrl($scope, $uibModal, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.openProjectModal = openProjectModal;
+ ctrl.handleModalData = handleModalData;
+ ctrl.version = {
+ "projects": []
+ }
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+ ctrl.data.successHandler(ctrl.version);
+ $uibModalInstance.dismiss('cancel');
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+
+ function handleModalData(project){
+ ctrl.version.projects.push(project)
+ }
+ function openProjectModal(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/projectModal.html',
+ controller: 'projectModalCtrl as projectModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Project",
+ successHandler: ctrl.handleModalData,
+ };
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('projectModalCtrl', projectModalCtrl);
+ projectModalCtrl.$inject = ['$scope', '$uibModal', '$uibModalInstance', 'data'];
+ function projectModalCtrl($scope, $uibModal, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.openCustomModal = openCustomModal;
+ ctrl.handleModalCustom = handleModalCustom;
+ ctrl.project = {
+ "scores": [],
+ "trust_indicators": [],
+ "customs": []
+ }
+
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+
+ ctrl.data.successHandler(ctrl.project);
+ $uibModalInstance.dismiss('cancel');
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+
+ function handleModalCustom(customs){
+ for (var custom in customs){
+ ctrl.project.customs.push(customs[custom]);
+ }
+ }
+
+ function openCustomModal(){
+ $uibModal.open({
+ templateUrl: 'testapi-ui/components/scenarios/modals/customModal.html',
+ controller: 'customModalCtrl as customModalCtrl',
+ size: 'md',
+ resolve: {
+ data: function () {
+ return {
+ text: "Custom",
+ successHandler: ctrl.handleModalCustom
+ };
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('customModalCtrl', customModalCtrl);
+ customModalCtrl.$inject = ['$scope', '$uibModalInstance', 'data'];
+ function customModalCtrl($scope, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.open = open;
+ ctrl.customs = []
+
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+ var custom = ctrl.custom;
+ if(custom!="" && custom!=undefined ){
+ ctrl.customs = custom.split(/[ ,]+/).filter(Boolean);
+ }
+ ctrl.data.successHandler(ctrl.customs);
+ $uibModalInstance.dismiss('cancel');
+
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+ }
+
+ /**
+ * TestAPI Project Modal Controller
+ * This controller is for the create modal where a user can create
+ * the project information and for the edit modal where user can
+ * edit the project's details
+ */
+ angular.module('testapiApp').controller('ScenarioNameUpdateCtrl', ScenarioNameUpdateCtrl);
+ ScenarioNameUpdateCtrl.$inject = ['$scope', '$uibModalInstance', 'data'];
+ function ScenarioNameUpdateCtrl($scope, $uibModalInstance, data) {
+ var ctrl = this;
+ ctrl.confirm = confirm;
+ ctrl.cancel = cancel;
+ ctrl.data = angular.copy(data);
+ ctrl.open = open;
+ ctrl.name = ctrl.data.name;
+
+
+ /**
+ * Initiate confirmation and call the success handler with the
+ * inputs.
+ */
+ function confirm() {
+ ctrl.data.successHandler(ctrl.name,ctrl.data.name).success( function() {
+ $uibModalInstance.dismiss('cancel');
+ })
+ }
+
+ /**
+ * Close the confirm modal without initiating changes.
+ */
+ function cancel() {
+ $uibModalInstance.dismiss('cancel');
+ }
+ }
+})();