aboutsummaryrefslogtreecommitdiffstats
path: root/d2ice.att.io/app/main/dashboard
diff options
context:
space:
mode:
authorPaul McGoldrick <paul.mcgoldrick@att.com>2017-09-28 10:36:03 -0700
committerPaul McGoldrick <paul.mcgoldrick@att.com>2017-09-28 10:36:03 -0700
commit1cd02f285d4d778dddfe34024da4b31afdc0afcd (patch)
tree91a597f81d6e9f75e9766db0dc4f6ac9b9ac5d58 /d2ice.att.io/app/main/dashboard
parent0e6fb5a0e199c00d5998052465f86a7a6812a474 (diff)
initial seed code commit VVP-9
Change-Id: I4d48180db7eba7cb7c299ab618f04d2092868085 Signed-off-by: Paul McGoldrick <paul.mcgoldrick@att.com>
Diffstat (limited to 'd2ice.att.io/app/main/dashboard')
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/account.controller.js150
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/account.html159
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/account.less215
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/account.module.js85
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/notifications/notifications.controller.js140
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/notifications/notifications.html60
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/notifications/notifications.less348
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.controller.js98
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.html66
-rwxr-xr-xd2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.less45
-rwxr-xr-xd2ice.att.io/app/main/dashboard/checklist/checklist.controller.js445
-rwxr-xr-xd2ice.att.io/app/main/dashboard/checklist/checklist.html117
-rwxr-xr-xd2ice.att.io/app/main/dashboard/checklist/checklist.less826
-rwxr-xr-xd2ice.att.io/app/main/dashboard/dashboard/dashboard.controller.js235
-rwxr-xr-xd2ice.att.io/app/main/dashboard/dashboard/dashboard.html111
-rwxr-xr-xd2ice.att.io/app/main/dashboard/dashboard/dashboard.less189
-rwxr-xr-xd2ice.att.io/app/main/dashboard/detailed-view/detailed-view.controller.js245
-rwxr-xr-xd2ice.att.io/app/main/dashboard/detailed-view/detailed-view.html109
-rwxr-xr-xd2ice.att.io/app/main/dashboard/detailed-view/detailed-view.less400
-rwxr-xr-xd2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.directive.js308
-rwxr-xr-xd2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.html38
-rwxr-xr-xd2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.less47
-rwxr-xr-xd2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.module.js48
-rwxr-xr-xd2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard-container.html192
-rwxr-xr-xd2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard.less255
-rwxr-xr-xd2ice.att.io/app/main/dashboard/main.module.js107
-rwxr-xr-xd2ice.att.io/app/main/dashboard/main/main.html172
-rwxr-xr-xd2ice.att.io/app/main/dashboard/overview/overview.controller.js833
-rwxr-xr-xd2ice.att.io/app/main/dashboard/overview/overview.html212
-rwxr-xr-xd2ice.att.io/app/main/dashboard/overview/overview.less575
30 files changed, 6830 insertions, 0 deletions
diff --git a/d2ice.att.io/app/main/dashboard/account/account.controller.js b/d2ice.att.io/app/main/dashboard/account/account.controller.js
new file mode 100755
index 00000000..da648f73
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/account.controller.js
@@ -0,0 +1,150 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('ice.dashboard.account')
+ .controller('DashboardAccountController', ["$state", "usersService", "vfService", "$log",
+ "$rootScope", "toastService", dashboardAccountController]);
+
+ function dashboardAccountController($state,usersService,vfService, $log, $rootScope, toastService) {
+
+ var vm = this;
+ vm.data = {};
+
+ var init = function()
+ {
+
+ vm.user = usersService.getUserData();
+
+ if (vm.user == undefined) {
+ $state.go('app.login');
+ return;
+ }
+
+ var user_uuid = vm.user.uuid;
+
+ $rootScope.ice.loader.show = true;
+ usersService.getIceUser(user_uuid)
+ .then
+ (function (response)
+ {
+ if (response.status === 200)
+ {
+ vm.data.full_name = response.data.full_name;
+ vm.data.email = response.data.email;
+ vm.data.phone_number = response.data.phone_number;
+ vm.data.password = ''; //user.password;
+ vm.data.ssh_key = response.data.ssh_public_key;
+ vm.data.company = response.data.company.name;
+ vm.data.access_key = response.data.rgwa_access_key;
+ vm.data.access_secret = "•••••••••••••••";
+ $rootScope.ice.loader.show = false;
+ }
+ else
+ {
+ toastService.setToast('Error getting account', 'danger');
+ $log.error("Error getting account: " + uuid);
+ $rootScope.ice.loader.show = false;
+ }
+ }
+ ).catch(function (error) {
+ toastService.setToast(error.message, 'danger');
+ $log.error(error.message);
+ });
+
+ vfService.getCompanies()
+ .then(function (response) {
+ if (response.status === 200)
+ {
+ vm.companies = response.data;
+ }
+ })
+ .catch(function (error)
+ {
+ $log.error(error.message);
+ });
+
+
+
+ };
+
+ init();
+
+ vm.getAccessSecret = function ()
+ {
+ usersService.getRGWASecret()
+ .then
+ (function (response)
+ {
+ if (response.status === 200)
+ {
+ vm.data.access_secret = response.data.rgwa_secret_key;
+ }
+ else
+ {
+ toastService.setToast('Error getting user\'s access secret', 'danger');
+ $log.error("Error getting access secret: " + uuid);
+ $rootScope.ice.loader.show = false;
+ }
+ }
+ ).catch(function (error) {
+ toastService.setToast(error.message, 'danger');
+ $log.error(error.message);
+ });
+ }
+
+ vm.submitForm = function ()
+ {
+ var user = usersService.getUserData();
+ usersService.updateAccount(user.uuid, vm.data)
+ .then(function (response) {
+ if (response.status === 200) {
+ toastService.setToast('Account was updated successfully!', 'success');
+ }
+ })
+ .catch(function (error) {
+ toastService.setToast(error.message.detail, 'danger');
+ });
+ };
+ }
+
+})();
diff --git a/d2ice.att.io/app/main/dashboard/account/account.html b/d2ice.att.io/app/main/dashboard/account/account.html
new file mode 100755
index 00000000..de792d3a
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/account.html
@@ -0,0 +1,159 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<ice-loader selector=".account-form"></ice-loader>
+
+<h2>Account</h2>
+
+<div data-ng-if="vm.stage!==vm.stages.intake">
+ <progress-directive progress="{{vm.progress}}"
+ callback="vm.updateProgress"
+ enable-edit="vm.isEngagementEL()"
+ engagement-uuid="{{vm.uuid}}"></progress-directive>
+</div>
+
+<!--div class="row main-section" -->
+<div class="row main-section">
+<get-started-modal></get-started-modal>
+
+
+ <div class="col-md-8 steps">
+
+ <form name="accountForm" ng-submit="vm.submitForm()" novalidate class="account-form col-md-8">
+<!--
+ <div class="form-group">
+ <h2>Account</h2>
+ </div>
+ -->
+ <div class="form-group" ng-class="{ 'has-error' : registerForm.company.$invalid && !registerForm.company.$pristine }">
+ <label class="ice-form-label required">Company</label>
+ <select ng-model="vm.data.company" name="company" class="form-control" required>
+ <option value>Please Select</option>
+ <option ng-repeat="company in vm.companies" value="{{company.name}}" ng-selected="company.name===vm.data.company">
+ {{company.name}}
+ </option>
+ </select>
+ <div class="ice-form-error" data-ng-show="accountForm.company.$error">
+ <span ng-show="accountForm.company.$error.required && !accountForm.company.$pristine" class="help-block">Please select company</span>
+ </div>
+ </div>
+
+ <div class="form-group" ng-class="{ 'has-error' : accountForm.fullName.$invalid && !accountForm.fullName.$pristine }">
+ <label class="ice-form-label required">Full Name</label>
+ <input type="text" name="fullname" class="form-control" ng-model="vm.data.full_name" ng-minlength="3" ng-maxlength="50" maxlength="50" required>
+ <div class="ice-form-error" data-ng-show="accountForm.fullname.$error">
+ <span ng-show="accountForm.fullname.$error.required && !accountForm.fullname.$pristine">Full Name is a required field.</span>
+ <span ng-show="accountForm.fullname.$error.minlength">Full Name is too short.</span>
+ <span ng-show="accountForm.fullname.$error.maxlength">Full Name is too long.</span>
+ </div>
+ </div>
+
+ <div class="form-group" ng-class="{ 'has-error' : accountForm.email.$invalid && !accountForm.email.$pristine }">
+ <label class="ice-form-label">Email</label>
+ <input id={{vm.data.email}} type="email" name="email" class="form-control" ng-model="vm.data.email" maxlength="254" ng-pattern='/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/' disabled>
+ <div class="ice-form-error" data-ng-show="accountForm.email.$error">
+ <span ng-show="accountForm.email.$error.required && !accountForm.email.$pristine">Email is a required field.</span>
+ <span ng-show="accountForm.email.$invalid && !accountForm.email.$pristine" class="help-block">Enter a valid email.</span>
+ </div>
+ </div>
+
+ <div class="form-group" ng-class="{ 'has-error' : accountForm.phone.$invalid && !accountForm.phone.$pristine }">
+ <label class="ice-form-label required">Phone</label>
+ <input type="text" name="phone" class="form-control" ng-intl-tel-input ng-model="vm.data.phone_number" required ng-minlength="6" ng-maxlength="30">
+ <div class="has-error ice-form-error" data-ng-show="accountForm.phone.$error">
+ <span ng-show="accountForm.phone.$error.required && !accountForm.phone.$pristine">Phone is a required field.</span>
+ <span ng-show="accountForm.phone.$error.minlength" class="help-block">Phone is too short.</span>
+ <span ng-show="accountForm.phone.$error.maxlength" class="help-block">Phone is too long.</span>
+ <span ng-show="accountForm.phone.$invalid" class="help-block">Phone format invalid</span>
+ </div>
+ </div>
+
+ <div class="form-group" ng-class="{ 'has-error' : accountForm.password.$invalid && !accountForm.password.$pristine }" >
+ <label class="ice-form-label">Password</label>
+ <input type="password" name="password" class="form-control" ng-model="vm.data.password" ng-minlength="4" ng-maxlength="32" maxlength="32" >
+ <div class="ice-form-error" data-ng-show="accountForm.password.$error">
+ <span ng-show="accountForm.password.$error.required && !accountForm.password.$pristine">Password is a required field.</span>
+ <span ng-show="accountForm.password.$error.required && accountForm.$submitted ">Password is required.</span>
+ <span ng-show="accountForm.password.$error.minlength" class="help-block">Password is too short.</span>
+ <span ng-show="accountForm.password.$error.maxlength" class="help-block">Password is too long.</span>
+ </div>
+ </div>
+
+ <div class="form-group" ng-class="{ 'has-error' : accountForm.confirm_password.$invalid && !accountForm.confirm_password.$pristine }">
+ <label class="ice-form-label">Confirm password</label>
+ <input type="password" name="confirm_password" class="form-control" ng-model="vm.data.confirm_password" ng-minlength="4" ng-maxlength="32" maxlength="32" >
+ <div class="ice-form-error" data-ng-show="accountForm.confirm_password.$error">
+ <span ng-show="accountForm.confirm_password.$error.required && !accountForm.confirm_password.$pristine">Confirm password is required field.</span>
+
+ <span ng-show="!accountForm.confirm_password.$error.required && accountForm.confirm_password.$error.noMatch && accountForm.password.$dirty">Passwords do not match.</span>
+
+ </div>
+ </div>
+
+ <div class="form-group" ng-class="{ 'has-error' : accountForm.password.$invalid && !accountForm.password.$pristine }">
+ <label class="ice-form-label">SSH Key</label>
+ <textarea name="ssh_key" class="form-control" ng-model="vm.data.ssh_key" ng-focus="clearMsg()" ></textarea>
+ <div class="ice-form-error" data-ng-show="accountForm.password.$error">
+ </div>
+ </div>
+
+ <button type="submit" id="upate-account" class="btn btn-primary" data-ng-disabled="!accountForm.$valid">Update</button>
+ </form>
+
+ </div>
+
+ <div class="col-md-4 right-panel">
+ <div class="personImage"></div>
+ <div class="line-separator col-md-12"></div>
+ <h3 id="storage-credentials">Your Storage Credentials</h3>
+ <div class="storage-credentials">
+
+ <div id="access-key-title">Access Key:
+ <div class="access-key" id="access-key-value">{{vm.data.access_key}}</div>
+ </div>
+
+ <div id="access-secret-title">Access Secret (<span class="show-secret" ng-click="vm.getAccessSecret()" role="button" id="show-access-secret">Show</span>)
+ <div class="access-secret" id="access-secret-value" type="password">{{vm.data.access_secret}}</div>
+ </div>
+
+ </div>
+ </div>
+ </div>
+
+</div>
+
diff --git a/d2ice.att.io/app/main/dashboard/account/account.less b/d2ice.att.io/app/main/dashboard/account/account.less
new file mode 100755
index 00000000..d32db492
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/account.less
@@ -0,0 +1,215 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+.account {
+
+ .btn {
+ width: 100%;
+ }
+
+ .btn-primary {
+ border: 1px solid #8799A3;
+ border-radius: 6px;
+ background: #1E79B0; /* For browsers that do not support gradients */
+ background: -webkit-linear-gradient(#1E79B0, #62ADD5); /* For Safari 5.1 to 6.0 */
+ background: -o-linear-gradient(#1E79B0, #62ADD5); /* For Opera 11.1 to 12.0 */
+ background: -moz-linear-gradient(#1E79B0, #62ADD5); /* For Firefox 3.6 to 15 */
+ background: linear-gradient(#1E79B0, #62ADD5); /* Standard syntax (must be last) */
+ }
+
+ .content {
+
+ .steps-progress-wrapper {
+ margin-top: 10px;
+ }
+
+ h1 {
+ .a_36;
+ margin: 0 0 30px 0;
+ }
+
+ h2 {
+ margin: 0 0 10px 0;
+ .a_24_m;
+ position: relative;
+ .add-people,
+ .add-step {
+ .sprite;
+ .sprite.add;
+ display: inline-block;
+ margin-left: 8px;
+ cursor: pointer;
+ }
+ }
+
+ h3 {
+ .a_20_m;
+ }
+
+ .main-section {
+ margin-top: 30px;
+ }
+
+ .steps {
+
+ border-right: dashed 1px @main_color_a;
+ height: 100%;
+ padding-right: 20px;
+
+ ul {
+ li.step {
+
+ &.selected {
+ background-color: #DEF3FF;
+ }
+
+ list-style: none;
+ position: relative;
+ padding: 10px 10px 10px 4px;
+
+ .description {
+
+ .m_16_r;
+ border-bottom: dashed 1px @main_color_n;
+ padding: 10px 0;
+
+ input {
+ position: absolute;
+ top: 10px;
+ left: 0;
+ margin-right: 20px;
+ }
+
+ .step-text {
+ margin-left: 20px;
+ }
+
+ .step-state {
+ position: absolute;
+ top: 24px;
+ &.todo {
+ .steps-sprite;
+ .steps-sprite.todo;
+ display: inline-block;
+ }
+ &.confirmed {
+ .steps-sprite;
+ .steps-sprite.confirmed;
+ display: inline-block;
+ }
+ &.completed {
+ .steps-sprite;
+ .steps-sprite.completed;
+ display: inline-block;
+ }
+ &.completed-non-el {
+ .steps-sprite;
+ .steps-sprite.completed-non-el;
+ display: inline-block;
+ }
+ }
+ }
+ .details {
+ .m_12_r;
+ margin-bottom: 20px;
+ .actions {
+ float: right;
+ margin-top: 4px;
+
+ .moveto-confirmed {
+ .sprite;
+ .sprite.success;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .moveto-todo {
+ .sprite;
+ .sprite.delete-circle;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .moveto-delete {
+ .sprite;
+ .sprite.delete;
+ display: inline-block;
+ cursor: pointer;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .right-panel {
+ height: 100%;
+ padding-left: 20px;
+ padding-bottom: 5px;
+
+ .personImage
+ {
+ .profiles-sprite;
+ .profiles-sprite.profile-large;
+ display: block;
+ }
+
+ .line-separator {
+ border-bottom: solid lightgrey;
+ margin: 20px 0;
+ }
+
+ .storage-credentials {
+ .m_18_r;
+ }
+
+ .access-key {
+ margin-bottom: 10px;
+ .m_16_r;
+ }
+
+ .access-secret {
+ margin-bottom: 10px;
+ .m_16_r;
+ }
+
+ .show-secret {
+ .underline;
+ cursor: pointer;
+ }
+ }
+ }
+}
diff --git a/d2ice.att.io/app/main/dashboard/account/account.module.js b/d2ice.att.io/app/main/dashboard/account/account.module.js
new file mode 100755
index 00000000..052cbbfb
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/account.module.js
@@ -0,0 +1,85 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('ice.dashboard.account')
+ .config(config);
+
+ function config($stateProvider) {
+ $stateProvider
+ .state('app.account', {
+ url: '/account',
+ views: {
+ 'content@app': {
+ templateUrl: 'main/dashboard/account/account.html',
+ controller: 'DashboardAccountController as vm'
+ },
+ 'navigation@app': {
+ templateUrl: 'core/navigation/layouts/account-navigation/navigation.html',
+ controller: 'accountNavigationController as vm'
+ }
+ },
+ params: {engagement_uuid: null},
+ bodyClass: 'account'
+ })
+ .state('app.account.notifications', {
+ url: '/account/notifications',
+ views: {
+ 'content@app': {
+ templateUrl: 'main/dashboard/account/notifications/notifications.html',
+ controller: 'DashboardNotificationsController as vm'
+ }
+ },
+ bodyClass: 'notifications'
+ })
+ .state('app.account.userProfile', {
+ url: '/account/userProfile',
+ views: {
+ 'content@app': {
+ templateUrl: 'main/dashboard/account/user-profile-settings/user-profile-settings.html',
+ controller: 'accountUserProfileSettingsController as vm'
+ }
+ },
+ bodyClass: 'account'
+ });
+ }
+})();
diff --git a/d2ice.att.io/app/main/dashboard/account/notifications/notifications.controller.js b/d2ice.att.io/app/main/dashboard/account/notifications/notifications.controller.js
new file mode 100755
index 00000000..0e9542dd
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/notifications/notifications.controller.js
@@ -0,0 +1,140 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+ 'use strict';
+ angular
+ .module('ice.dashboard.account')
+ .controller('DashboardNotificationsController', ["$state","pageService","usersService", "toastService", "$rootScope", "$scope", "$log", dashboardNotificationsController]);
+
+ function dashboardNotificationsController($state,pageService, usersService, toastService, $rootScope, $scope, $log) {
+ var vm = this;
+ vm.data = {};
+ var init = function()
+ {
+ pageService.setPage('notification');
+ $rootScope.timeGapLocal = moment().format("z");// timeGap();
+ $rootScope.ampm = moment().format('A');
+ $rootScope.mom =moment().tz( moment.tz.guess()).format('z');
+
+ vm.pagination_num_of_objects = 10;
+ vm.current_starting_offset = "0";
+ vm.page_num = 1;
+ vm.user = usersService.getUserData();
+ if (vm.user == undefined) {
+ $state.go('app.login');
+ return;
+ }
+ vm.getNotifications(true)
+ }
+
+ vm.getNotifications = function (reset) {
+ var user_uuid = vm.user.uuid;
+ $rootScope.ice.loader.show = true;
+ vm.current_starting_offset = (vm.page_num-1)*vm.pagination_num_of_objects;
+ usersService.getNotificationsDescription(vm.user.uuid,vm.current_starting_offset,vm.pagination_num_of_objects)
+ .then
+ (function (response)
+ {
+ if (response.status === 200)
+ {
+ vm.notifications = response.data['serilizedActivitySet'];
+ vm.num_of_returned_items = response.data['num_of_objects'];
+ vm.notifications_display_list = vm.notifications;
+ if (reset){
+ usersService.resetNotificationNum(user_uuid)
+ .then
+ (function (response)
+ {
+ if (response.status === 200)
+ {
+ $scope.$emit('eventClearNotifications',0);
+ }
+ }
+ )
+ .catch(function (error) {
+ toastService.setToast(error.message, 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ }
+ $rootScope.ice.loader.show = false;
+ }
+ else
+ {
+ toastService.setToast(response.error, 'danger');
+ $rootScope.ice.loader.show = false;
+ }
+ }
+ )
+ .catch(function (error) {
+ toastService.setToast(error.message, 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ }
+ );
+ };
+
+ vm.delNotification = function(uuid)
+ {
+ var itemIndex = 0;
+
+ for(var i=0; i < vm.notifications.length; i++)
+ {
+ if (vm.notifications[i].uuid == uuid)
+ {
+ itemIndex = i;
+ break;
+ }
+ }
+ usersService.notificationsDelete(uuid)
+ .then
+ (function (response) {
+ if (response.status != 400){
+ vm.notifications.splice(itemIndex , 1);
+ }
+ })
+ .catch(function (error) {
+ toastService.setToast(error.message, 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ }
+ init();
+ }
+})(); \ No newline at end of file
diff --git a/d2ice.att.io/app/main/dashboard/account/notifications/notifications.html b/d2ice.att.io/app/main/dashboard/account/notifications/notifications.html
new file mode 100755
index 00000000..f92cc41a
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/notifications/notifications.html
@@ -0,0 +1,60 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<ice-loader selector=".account-form"></ice-loader>
+
+<div class="row">
+ <div class="col-md-12" id="notifications">
+ <h2>Notifications</h2>
+ </div>
+ <div class="col-md-12">
+ <form name="notificationsForm" novalidate class="notifications-form">
+ <content class="row col-md-12" id="notifications-results">
+ <div class=" row hoverCyan " dir-paginate="notification in vm.notifications_display_list | itemsPerPage: vm.pagination_num_of_objects"
+ total-items="vm.num_of_returned_items" current-page="vm.page_num"
+ ng-class="{lineColor: ($index % 2 == 0),boldFont: !notification.is_read}" track by notification.uuid >
+ <div class="electricity col-md-1"></div>
+ <div class="col-md-10" id="table-col-{{notification.uuid}}"><notifications activity="notification.activity"></notifications></div>
+ <div class="col-md-1"><span class="delete" id="del-notification-{{notification.uuid}}" ng-click = "vm.delNotification(notification.uuid)"></span></div>
+ </div>
+ </div>
+ <dir-pagination-controls on-page-change="vm.getNotifications(false)" class="col-md-12" id="notifications-pagination"></dir-pagination-controls>
+ </content>
+ </form>
+ </div>
+</div>
diff --git a/d2ice.att.io/app/main/dashboard/account/notifications/notifications.less b/d2ice.att.io/app/main/dashboard/account/notifications/notifications.less
new file mode 100755
index 00000000..7981be89
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/notifications/notifications.less
@@ -0,0 +1,348 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+.engagement_link {
+ text-decoration: underline;
+ cursor:pointer;
+}
+.notifications {
+
+ .table{
+ margin-bottom: 0;
+ }
+
+ .table-container-flex {
+
+ .data-row-wrapper {
+ padding: 10px 20px;
+ }
+
+ .flex-item:nth-child(1) {
+ padding-left: 5px;
+ padding-top: 15px;
+ flex-grow: 2;
+ }
+
+ .flex-item:nth-child(2) {
+ padding-top: 12px;
+ flex-grow: 93;
+ }
+
+ .flex-item:nth-child(3) {
+ padding-top: 12px;
+ flex-grow: 5;
+ }
+
+ }
+
+ .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus
+ {
+ background-color: #DEF3FF;
+ border-color: #DDDDDD;
+ color: #000000;
+ cursor:pointer;
+ z-index:2;
+ }
+
+ .btn {
+ width: 100%;
+ }
+
+ .lineColor
+ {
+ background-color:#F6F3F3;
+ }
+
+ .electricity
+ {
+ .sprite;
+ .sprite.electricity;
+ display: block;
+ margin-top: 10px;
+ margin-left: 10px;
+ }
+
+ .delete
+ {
+ .sprite;
+ .sprite.delete-circle;
+ display: block;
+ cursor:pointer;
+ margin-top: 11px;
+ }
+
+
+ .fLeft
+ {
+ float:left;
+ height:50px;
+ }
+
+ .hoverCyan
+ {
+ line-height: 40px;
+ &:hover {
+ background-color: #DEF3FF;
+ }
+ }
+
+ .boldFont
+ {
+ font-weight: bold;
+ }
+
+ .marginLeft60
+ {
+ margin-left:-60px;
+ }
+
+ .height510
+ {
+ height:510px;
+ margin-top:-30px;
+ }
+
+ .height50
+ {
+ height:50px;
+ line-height:50px;
+ width:1100px;
+ }
+
+ .marginLeft5
+ {
+ margin-left:5px;
+ }
+
+ .marginTop5
+ {
+ margin-top:5px;
+ margin-left: 40px;
+ }
+
+ .personImage
+ {
+ .profiles-sprite;
+ .profiles-sprite.profile-large;
+ display: block;
+ }
+
+ .textAlignCenter
+ {
+ text-align:center;
+ width:1100px
+ }
+
+ .btn-primary {
+ border: 1px solid #8799A3;
+ border-radius: 6px;
+ background: #1E79B0; /* For browsers that do not support gradients */
+ background: -webkit-linear-gradient(#1E79B0, #62ADD5); /* For Safari 5.1 to 6.0 */
+ background: -o-linear-gradient(#1E79B0, #62ADD5); /* For Opera 11.1 to 12.0 */
+ background: -moz-linear-gradient(#1E79B0, #62ADD5); /* For Firefox 3.6 to 15 */
+ background: linear-gradient(#1E79B0, #62ADD5); /* Standard syntax (must be last) */
+ }
+
+ .pad17
+ {
+ padding-top:17px;
+ display: block;
+ }
+
+ .content {
+
+ .steps-progress-wrapper {
+ margin-top: 10px;
+ }
+
+ h1 {
+ .a_36;
+ margin: 0 0 30px 0;
+ }
+
+ h2 {
+ margin: 0 0 10px 0;
+ .a_24_m;
+ position: relative;
+ .add-people,
+ .add-step {
+ .sprite;
+ .sprite.add;
+ display: inline-block;
+ margin-left: 8px;
+ cursor: pointer;
+ }
+ }
+
+ .main-section {
+ margin-top: 30px;
+ }
+
+ .steps {
+
+
+ height: 100%;
+ padding-right: 20px;
+
+ ul {
+ li.step {
+
+ &.selected {
+ background-color: #DEF3FF;
+ }
+
+ list-style: none;
+ position: relative;
+ padding: 10px 10px 10px 4px;
+
+ .description {
+
+ .m_16_r;
+
+ padding: 10px 0;
+
+ input {
+ position: absolute;
+ top: 10px;
+ left: 0;
+ margin-right: 20px;
+ }
+
+ .step-text {
+ margin-left: 20px;
+ }
+
+ .step-state {
+ position: absolute;
+ top: 24px;
+ &.todo {
+ .steps-sprite;
+ .steps-sprite.todo;
+ display: inline-block;
+ }
+ &.confirmed {
+ .steps-sprite;
+ .steps-sprite.confirmed;
+ display: inline-block;
+ }
+ &.completed {
+ .steps-sprite;
+ .steps-sprite.completed;
+ display: inline-block;
+ }
+ &.completed-non-el {
+ .steps-sprite;
+ .steps-sprite.completed-non-el;
+ display: inline-block;
+ }
+ }
+ }
+ .details {
+ .m_12_r;
+ margin-bottom: 20px;
+ .actions {
+ float: right;
+ margin-top: 4px;
+
+ .moveto-confirmed {
+ .sprite;
+ .sprite.success;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .moveto-todo {
+ .sprite;
+ .sprite.delete-circle;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .moveto-delete {
+ .sprite;
+ .sprite.delete;
+ display: inline-block;
+ cursor: pointer;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .team-and-logs {
+ height: 100%;
+ padding-left: 20px;
+ .team {
+ ul.team-avatars {
+
+ li {
+ list-style: none;
+ display: inline-block;
+ margin-right: 10px;
+ .profiles-sprite;
+ .profiles-sprite.profile-medium;
+
+ &.me {
+ .profiles-sprite;
+ .profiles-sprite.avatar-blue;
+ }
+ }
+ }
+ }
+
+ .activity-log {
+ ul.activity-log-details {
+ li {
+ list-style: none;
+ position: relative;
+ margin-left: 30px;
+
+ &:before {
+ content: '';
+ display: inline-block;
+ .sprite;
+ .sprite.electricity;
+ position: absolute;
+ top: 0;
+ left: -30px;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.controller.js b/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.controller.js
new file mode 100755
index 00000000..6d51a440
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.controller.js
@@ -0,0 +1,98 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+ 'use strict';
+ angular
+ .module('ice.dashboard.account')
+ .controller('accountUserProfileSettingsController', ['toastService', 'usersService',
+ accountUserProfileSettingsController]);
+
+ function accountUserProfileSettingsController(toastService, usersService) {
+ var vm = this;
+
+ var init = function()
+ {
+ usersService.getIceUser()
+ .then
+ (function (response) {
+ vm.receiveEmails = response.data.regular_email_updates;
+ vm.receiveEmailsEveryTime = response.data.email_updates_on_every_notification;
+ vm.receiveDigestEmails = response.data.email_updates_daily_digest;
+
+ vm.receiveNotifications = vm.receiveEmailsEveryTime || vm.receiveDigestEmails;
+ }
+ ).catch(function (error) {
+ toastService.setToast(error.message, 'danger');
+ $log.error(error.message);
+ });
+ };
+
+ vm.submitForm = function() {
+ var user = usersService.getUserData();
+ var userData = {};
+
+ userData.regular_email_updates = vm.receiveEmails;
+ userData.email_updates_on_every_notification = vm.receiveEmailsEveryTime;
+ userData.email_updates_daily_digest = vm.receiveDigestEmails;
+ userData.company = user.company.name;
+ userData.full_name = user.full_name;
+ userData.email = user.email;
+ userData.phone_number = user.phone_number;
+
+ usersService.updateAccount(user.uuid, userData)
+ .then(function (response) {
+ if (response.status === 200) {
+ toastService.setToast('User profile settings was updated successfully!', 'success');
+ }
+ })
+ .catch(function (error) {
+ toastService.setToast(error.message.detail, 'danger');
+ });
+ };
+
+ vm.changeReceiveNotifications = function() {
+ if(!vm.receiveNotifications) {
+ vm.receiveEmailsEveryTime = false;
+ vm.receiveDigestEmails = false;
+ }
+ };
+
+ init();
+ }
+})();
diff --git a/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.html b/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.html
new file mode 100755
index 00000000..521c73ab
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.html
@@ -0,0 +1,66 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<ice-loader selector=".user-profile-settings-form"></ice-loader>
+<h2 id="user-profile-settings-title">Settings</h2>
+<form name="userProfileSettingsForm" ng-submit="vm.submitForm()" novalidate class="user-profile-settings-form col-md-6">
+ <div class="form-check">
+ <label class="form-check-label">
+ <input class="form-check-input" id="receive-emails" ng-model="vm.receiveEmails" type="checkbox"> I want to receive regular email updates and information from {{'program.name' | i18next}}
+ </label>
+ </div>
+ <hr>
+ <div class="form-check">
+ <label class="form-check-label">
+ <input class="form-check-input" id="receive-notifications" ng-model="vm.receiveNotifications" ng-click="vm.changeReceiveNotifications()" type="checkbox"> I want to receive email notifications when something happens on {{'program.name' | i18next}}
+ </label>
+ <div class="receive-email-options">
+ <div class="form-check">
+ <label class="form-check-label">
+ <input class="form-check-input" id="receive-emails-every-time" ng-model="vm.receiveEmailsEveryTime" ng-disabled="!vm.receiveNotifications" type="checkbox"> I want to receive an email every time
+ </label>
+ </div>
+ <div class="form-check">
+ <label class="form-check-label">
+ <input class="form-check-input" id="receive-digest-emails" ng-model="vm.receiveDigestEmails" ng-disabled="!vm.receiveNotifications" type="checkbox"> I want to receive a daily digest email
+ </label>
+ </div>
+ </div>
+ </div>
+ <button type="submit" id="update-account-user-profile-settings" class="btn btn-primary" data-ng-disabled="userProfileSettingsForm.$invalid">Update</button>
+</form>
diff --git a/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.less b/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.less
new file mode 100755
index 00000000..41ad47ec
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/account/user-profile-settings/user-profile-settings.less
@@ -0,0 +1,45 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+.user-profile-settings-form {
+ .receive-email-options {
+ padding-left: 20px;
+ }
+}
+
+
diff --git a/d2ice.att.io/app/main/dashboard/checklist/checklist.controller.js b/d2ice.att.io/app/main/dashboard/checklist/checklist.controller.js
new file mode 100755
index 00000000..293134cd
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/checklist/checklist.controller.js
@@ -0,0 +1,445 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+ 'use strict';
+ angular
+ .module('ice.dashboard.checklist',[])
+ .controller('DashboardChecklistController', ["$scope", "$stateParams", "$rootScope", "checklistService",
+ "iceConstants", "usersService", "$uibModal", "toastService", "$log", DashboardChecklistController]);
+ function DashboardChecklistController($scope, $stateParams, $rootScope, checklistService, iceConstants,
+ usersService, $uibModal, toastService, $log) {
+
+ var vm = this;
+ vm.data = {};
+ var engagementUuid = $stateParams.engagement_uuid;
+ vm.checklistUuid = $stateParams.sub_id;
+ vm.selected_decision = false;
+
+ var init = function() {
+ if (vm.checklistUuid == null)
+ return;
+
+ checklistService.getChecklist(vm.checklistUuid)
+ .then(function (response) {
+ if (response.status === 200) {
+ vm.data = response.data;
+ vm.data.states = iceConstants.checklist_states;
+ vm.me = usersService.getUserData();
+ vm.is_peer_reviewer = usersService.isPeerReviewer(vm.me, response.data.checklist.engagement.peer_reviewer.uuid);
+ // if state pending dont allow changing data manually
+ if(vm.data.checklist.associated_files) {
+ vm.has_files = true;
+ }
+ else {
+ vm.has_files = false;
+ }
+ vm.formatDecisions();
+
+ }
+ })
+ .catch(function (error) {
+ if (error.status === 410) {
+ $rootScope.$broadcast('onUpdateEngagements',{
+ select:{
+ uuid: $stateParams.engagement_uuid,
+ view_type : 'overview',
+ sub_id: undefined
+ }
+ });
+ }
+ else{
+ $log.error(error.message);
+ return false;
+ }
+ });
+ };
+
+
+ vm.formatDecisions = function () {
+ var section_counter = 0;
+ vm.data.checklistDecisions = _.orderBy(vm.data.checklistDecisions, 'weight');
+ angular.forEach(vm.data.checklistDecisions, function(section,section_key) {
+ section_counter ++;
+ section.counter = section_counter;
+ var decision_counter = 0;
+ section.decisions = _.orderBy(section.decisions, 'weight');
+ angular.forEach(section.decisions,function(decision,decision_key) {
+ decision_counter++;
+ // add text of section and line number E.g 2.1
+ decision.counter = section_counter+'.'+decision_counter;
+
+ // set selected decision default value
+ if (vm.selected_decision == false)
+ {
+ vm.selected_decision = decision;
+ vm.selectDecision(decision);
+ }
+
+ // choose which decision value to show
+ var view_value;
+ switch(vm.data.checklist.state)
+ {
+ case 'peer_review':
+ view_value = decision.peer_review_value;
+ break;
+ case 'review':
+ case 'approval':
+ case 'handoff':
+ case 'closed':
+ view_value = decision.review_value;
+ break;
+ }
+
+ // choose which ucib to show
+ var view_value_css;
+ switch(view_value)
+ {
+ case 'approved':
+ view_value_css = 'sprite approved-cl';
+ break;
+ case 'denied':
+ view_value_css = 'sprite denied-cl';
+ break;
+ case 'not_relevant':
+ view_value_css = 'sprite not-relevant-cl';
+ break;
+ }
+
+ // choose which line item type icon to show
+ var auto_icon_css
+ switch(decision.lineitem.line_type)
+ {
+ case 'auto':
+ auto_icon_css = 'sprite automation-state';
+ }
+ vm.data.checklistDecisions[section_key].decisions[decision_key]['selected-value'] = view_value
+ vm.data.checklistDecisions[section_key].decisions[decision_key]['view_value'] = view_value;
+ vm.data.checklistDecisions[section_key].decisions[decision_key]['view_value_css'] = view_value_css;
+ vm.data.checklistDecisions[section_key].decisions[decision_key]['auto_icon_css'] = auto_icon_css;
+ });
+ });
+ // after decision change refresh which state buttons to shows
+ vm.refreshStateOptions();
+
+ };
+
+ // set decision value
+ vm.setDecision = function(decision,value) {
+ checklistService.putChecklistDecision(decision.uuid,{value:value})
+ .then(function (response) {
+ if (response.status === 200) {
+ switch(vm.data.checklist.state)
+ {
+ case 'peer_review':
+ decision.peer_review_value = value;
+ break;
+ case 'review':
+ decision.review_value = value;
+ break;
+ }
+ vm.formatDecisions();
+ }
+ });
+
+ };
+
+ // decice which state change buttons to choose
+ vm.refreshStateOptions = function () {
+ var force_break = false;
+ vm.is_able_to_approve = true;
+ angular.forEach(vm.data.checklistDecisions, function (section,key) {
+ if (!force_break)
+ angular.forEach(section.decisions, function (decision,key) {
+ if (!force_break){
+ // if not all decisions have value only only next_step
+ if ( decision['view_value'] != 'approved' && decision['view_value'] != 'not_relevant' ) {
+ vm.is_able_to_approve = false;
+ force_break=true;
+ }
+ }
+ });
+
+ });
+ };
+
+ // set state
+ vm.stateAction = function(action) {
+ switch(action)
+ {
+ case 'approve':
+ var postData = {};
+ postData["description"] = '';
+ postData["decline"] = "False";
+ checklistService.setState(vm.data.checklist.uuid, postData)
+ .then(function (response) {
+ if (response.status === 200) {
+ $rootScope.$broadcast('onUpdateEngagements',{select:{uuid:engagementUuid,page_type:'overview',sub_id:vm.data.checklist.uuid}});
+ }
+ else {
+ toastService.setToast(response.error, 'danger');
+ $rootScope.ice.loader.show = false;
+ }
+ })
+ .catch(function (error) {
+ $log.error(error);
+ toastService.setToast(error.status + ': Error changing progress!', 'danger');
+ });
+ break;
+ case 'reject':
+ vm.openSetState(action,vm.data.checklist);
+ break;
+ case 'next_step':
+ vm.openNextSteps(vm.data.checklist);
+ break;
+ }
+ };
+
+ vm.formatDate = function (create_time) {
+ var region = moment().tz( moment.tz.guess()).format('z');
+ var dt = "";
+ dt = moment(create_time).local().format('YYYY-MM-DD hh:mm:ss A') + " " + region;
+ return dt;
+ };
+
+ // add decision log
+ vm.submitDecisionAuditLog = function () {
+
+ var jsonPost = {"description":vm.selected_decision.new_audit_log_description};
+ checklistService.createAuditlogDecisionChecklist(vm.selected_decision.uuid, jsonPost)
+ .then(function (response) {
+ if (response.status === 200)
+ {
+ if (vm.data.decisionAuditLogs[vm.selected_decision.uuid] == undefined)
+ vm.data.decisionAuditLogs[vm.selected_decision.uuid] = []
+ vm.data.decisionAuditLogs[vm.selected_decision.uuid].push(response.data);
+ vm.selected_decision.new_audit_log_description = ""
+ }
+ else
+ {
+ toastService.setToast(response.error, 'danger');
+ $rootScope.ice.loader.show = false;
+ }
+ })
+ .catch(function (error) {
+ toastService.setToast(error.message, 'danger');
+ $log.error(error.message);
+ });
+ }
+
+ // choose active decision
+ vm.selectDecision = function(decision,$event) {
+ if(vm.selected_decision != decision || vm.selected_decision.selected === undefined) {
+ // remove status from previos decision
+ vm.selected_decision.selected = false;
+
+ // populate new decision
+ vm.selected_decision = decision;
+ vm.selected_decision.selected = true;
+
+ $scope.$$postDigest(function () {
+ // Make extended window follow selected decision line
+ if ($event != undefined)
+ {
+ var line_item_bottom_offset = angular.element($event.target).prop('offsetHeight') + angular.element($event.target).prop('offsetTop');
+ var extendended_item_height = angular.element("#line-item-extended").prop('offsetHeight');
+ var diff_between_elements = line_item_bottom_offset - extendended_item_height;
+ if (diff_between_elements > 0)
+ {
+ angular.element("#line-item-extended").css('margin-top',(20+diff_between_elements) +'px')
+ } else {
+ angular.element("#line-item-extended").css('margin-top','')
+ }
+ }
+ });
+ }
+ };
+
+ // next steps modal
+ vm.openNextSteps = function(checklist) {
+ var modalInstance = $uibModal.open(
+ {
+ templateUrl: 'main/modals/next-steps/next-steps.html',
+ controller: 'NextStepsModalController',
+ controllerAs: 'vm',
+ size: 'lg',
+ resolve: {
+ engagement_team: function () {
+ return checklist.engagement.engagement_team;
+ },
+ title: function () {
+ return checklist.name;
+ },
+ associated_files: function () {
+ return checklist.repo_associated_files;
+ },
+ engagement_uuid: function () {
+ return checklist.engagement.uuid;
+ },
+ checklist: function () {
+ return checklist;
+ },
+ nextstep: function () {
+ return undefined;
+ }
+
+ }
+ });
+
+ modalInstance.result.then(function (data) {
+ if (data === 200) {
+ $rootScope.$broadcast('onUpdateEngagements',{select:{uuid:engagementUuid,page_type:'overview',sub_id:checklist.uuid}});
+ }
+ }, function () {
+ });
+ };
+
+ // set state modal
+ vm.openSetState = function(action,checklist) {
+ var modalInstance = $uibModal.open(
+ {
+ templateUrl: 'main/modals/checklist/state-approve-or-reject/state-approve-or-reject.html',
+ controller: 'stateDecisionModalController',
+ controllerAs: 'vm',
+ resolve: {
+ checklist: function () {return checklist},
+ action: function () {return action}
+ }
+ });
+
+ modalInstance.result.then(function (data) {
+ if (data) {
+ $rootScope.$broadcast('onUpdateEngagements',{select:{uuid:engagementUuid,page_type:'overview',sub_id:checklist.uuid}});
+ }
+ }, function () {
+ });
+
+ };
+
+ vm.openJenkinsLogModal = function () {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/general-log-modal/general-log-modal.html',
+ controller: 'GeneralLogModalController',
+ controllerAs: 'vm',
+ size: 'general-log-modal',
+ resolve: {
+ modalDetails: function () {
+ return {
+ "headline": 'Jenkins log',
+ "body": vm.data.checklist.jenkins_log,
+ };
+ }
+ }
+ });
+ };
+
+ // audit log modal
+ vm.auditLog = function() {
+
+ var auditLogData = {
+ name:vm.data.checklist.name,
+ uuid:vm.data.checklist.uuid,
+ checklistAuditLogs: vm.data.checklistAuditLogs
+
+ };
+
+ var modalInstance = $uibModal.open(
+ {
+ templateUrl: 'main/modals/audit-log/audit-log.html',
+ controller: 'AuditLogModalController',
+ controllerAs: 'vm',
+ size: 'lg'
+
+ ,
+ resolve: {
+ wizardData: function () {
+ return auditLogData;
+ }
+ }
+ });
+
+ modalInstance.result.then(function (data) {
+ if (data) {
+ vm.data.checklistAuditLogs.push(data);
+ }
+ }, function () {
+ $log.debug('Modal dismissed at: ' + new Date());
+ });
+ };
+
+ // edit checklist
+ vm.editChecklist = function() {
+ var checklistData = {
+ uuid:vm.data.checklist.uuid,
+ name:vm.data.checklist.name,
+ templates:vm.data.checklist.templates,
+ selectedTemplateUuid:vm.data.checklist.template.uuid,
+ selectedTemplateName:vm.data.checklist.template.name,
+ associatedFiles:vm.data.checklist.associated_files,
+ state:vm.data.checklist.state
+ };
+
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/checklist/checklist.html',
+ controller: 'ChecklistModalController',
+ controllerAs: 'vm',
+ size: 'lg'
+ ,
+ resolve: {
+ wizardData: function () {
+ return checklistData;
+ },
+ engagementUuid: function () {
+ return engagementUuid;
+ },
+ modal_type: function () {
+ return 'update';
+ }
+ }
+ });
+ modalInstance.result.then(function (data) {
+ if (data) {
+ vm.data.checklist.name = data.checklist_name;
+ vm.data.checklist.associated_files = data.associated_files;
+ }
+ });
+ };
+
+ init();
+ }
+})();
diff --git a/d2ice.att.io/app/main/dashboard/checklist/checklist.html b/d2ice.att.io/app/main/dashboard/checklist/checklist.html
new file mode 100755
index 00000000..b8da8836
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/checklist/checklist.html
@@ -0,0 +1,117 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<div class="checkList" ng-disabled="true" ng-if="vm.data != false">
+<section id="state-bar" class="row ">
+ <ul class="nav nav-justified col-md-12">
+ <li ng-attr-id="{{ vm.data.checklist.state.replace('_',' ') == state ? 'state'+'_'+vm.data.checklist.name : ''}}" ng-class="{'active' : vm.data.checklist.state.replace('_',' ') == state}" data-ng-repeat="state in vm.data.states" >
+ <span class="state-icon sprite {{state.replace(' ','_')}}-state"></span>{{$index + 1}}. {{state}}
+ </li>
+ </ul>
+</section>
+<header class="row" id="cl-header"> <!-- start of header -->
+ <h1 class="col-sm-12 col-xs-12 col-md-6" id="cl-title"> <!-- start of title -->
+ <span id="edit-checklist" class="sprite edit-medium" ng-if="vm.data.checklist.state != 'closed' && !vm.is_peer_reviewer" ng-click="vm.editChecklist()" ></span>
+ <span class="bold" >Checklist:</span>
+ <span id="cl-name-id">{{vm.data.checklist.name}}</span>
+ </h1> <!-- end of title -->
+ <div class = "cl-action-buttons-frame col-sm-12 col-xs-12 col-md-6">
+
+ <div ng-if="vm.data.checklist.state != 'closed'" id="state-actions" class="">
+ <button class="btn btn-gradient-success" ng-if="vm.data.checklist.state != 'pending' && vm.data.checklist.state != 'automation' && (vm.data.checklist.state == 'pending' || vm.is_able_to_approve)" ng-click="vm.stateAction('approve')">
+ {{vm.data.checklist.state == 'pending' ? 'Automate' : vm.data.checklist.state == 'handoff' ? 'Handoff complete?' : 'Approve'}}
+ </button>
+ <button id="state-actions-btn-reject" class="btn btn-gradient-danger" ng-if="vm.has_files && vm.data.checklist.state != 'handoff' && vm.data.checklist.state != 'pending' && vm.data.checklist.state != 'automation'" ng-click="vm.stateAction('reject')">Reject</button>
+ <button id="state-actions-btn-add-next-steps" class="btn btn-gradient-primary" ng-if="vm.data.checklist.state != 'handoff' && vm.data.checklist.state != 'pending'" ng-click="vm.stateAction('next_step')">Add Next Steps</button>
+ </div>
+ <ul class="" id="cl-side-actions"> <!-- start of side actions -->
+ <li><span id="audit-log" ng-click="vm.auditLog()">Audit Log ({{vm.data.checklistAuditLogs.length}})</span></li>
+ <li><span id="jenkins-log" ng-click="vm.openJenkinsLogModal()">Jenkins Log</span></li>
+
+ </ul>
+ </div>
+</header>
+
+<article class="row" ng-class="{'blocked-area' : vm.data.checklist.state == 'pending' || vm.data.checklist.state == 'automation' }" id="checklist-main-section" >
+ <ul class="col-md-6" id="line-item-list"> <!-- start of line item list -->
+ <li data-ng-repeat="section in vm.data.checklistDecisions | toArray:false"><h2><span class="bold">Section {{section.counter}}:</span> {{section.section.name}}</h2> <!-- start of section -->
+ <ul>
+ <li data-ng-repeat="decision in section.decisions | toArray:false" class="line-item-row" ng-class="{'selected-line' : decision.selected }" ng-click="vm.selectDecision(decision,$event)"> <!-- start if line item row -->
+ <span class="col-sm-2 col-xs-2 col-md-2 value-icon"><span ng-class="decision.view_value_css" id="{{decision.uuid}}_{{decision.view_value}}" ></span>{{decision.counter}}</span>
+ <span class="col-sm-9 col-xs-9 col-md-9" ng-class="decision.lineitem.line_type" name="{{decision.lineitem.name}}">{{decision.lineitem.name}}</span>
+ <span class="col-sm-1 col-xs-1 col-md-1 auto-icon"><span ng-class="decision.auto_icon_css"></span></span>
+ <span class="selected-line-connector"></span>
+ </li> <!-- end of line item row -->
+ </ul>
+ </li> <!-- end of section -->
+ </ul> <!-- end of line item list -->
+ <aside class="col-md-6" id="line-item-extended"> <!-- start of line item extended view -->
+ <header class="row"> <!-- start of line-item extended header -->
+ <h2 class="col-sm-8 col-xs-8 col-md-8"><span class="bold">{{vm.selected_decision.counter}} -</span> {{vm.selected_decision.lineitem.name}}</h2>
+ <ul class="col-sm-4 col-xs-4 col-md-4" ng-if="(vm.data.checklist.state == 'review' || vm.data.checklist.state == 'peer_review' ) &&
+ vm.selected_decision.lineitem.line_type == 'manual'" ng-class="{'active' : vm.selected_decision.lineitem.line_type == 'manual'}" id="decision-actions">
+ <li class="not-relevant-btn" ng-class="{'active' : vm.selected_decision['selected-value'] == 'not_relevant'}" ng-click="vm.selected_decision.lineitem.line_type == 'manual' && vm.setDecision(vm.selected_decision,'not_relevant')"></li>
+ <li class="denied-cl-btn" ng-class="{'active' : vm.selected_decision['selected-value'] == 'denied'}" ng-click="vm.selected_decision.lineitem.line_type == 'manual' && vm.setDecision(vm.selected_decision,'denied')"></li>
+ <li class="approved-cl-btn" ng-class="{'active' : vm.selected_decision['selected-value'] == 'approved'}" ng-click="vm.selected_decision.lineitem.line_type == 'manual' && vm.setDecision(vm.selected_decision,'approved')"></li>
+ </ul>
+ </header> <!-- end of line-item extended header -->
+ <section id="line-item-description" ng-bind-html="vm.selected_decision.lineitem.description | htmlspecialchars | htmlstylespan"></section>
+ <section id="line-item-validation-instructions">
+ <h3>Validation Instructions</h3>
+ <p ng-bind-html="vm.selected_decision.lineitem.validation_instructions | htmlspecialchars"></p>
+ </section>
+ <section id="line-item-audit-logs" class="row"> <!-- start of line item audit logs -->
+ <h3 class="col-md-12">audit logs</h3>
+ <ul id="audit-log-list" class="col-md-12"> <!-- start of audit log list- -->
+ <li class="row" ng-repeat="auditlog in vm.data.decisionAuditLogs[vm.selected_decision.uuid] | orderBy:'create_time'">
+ <h4 class="col-md-6 audit-creator">{{auditlog.creator.full_name}}</h4><span class="col-md-6 audit-date">{{vm.formatDate(auditlog.create_time)}}</span>
+ <p id="line-item-audit-log-{{$index}}" class="col-md-12 audit-text">{{auditlog.description}}</p>
+ </li>
+
+ </ul> <!-- end of audit log list -->
+ <form name="checklistAuditLog" id="new-audit-log-from" ng-submit="vm.submitDecisionAuditLog()" novalidate class="row col-md-12"> <!-- start of new audit log form -->
+ <textarea name="TextBox" class="col-sm-12 col-xs-12 col-md-12" ng-model="vm.selected_decision.new_audit_log_description" id="new-audit-log-text" ng-trim="false" required></textarea>
+ <div data-ng-show="checklistAuditLog.TextBox.$error" class="ice-form-error">
+ <span ng-show="checklistAuditLog.TextBox.$error.pattern">Inserted text should not include any special chars such as: \%_* ."</span>
+ </div>
+ <button type="submit" class="col-sm-12 col-xs-12 col-md-12 btn btn-gradient-primary" id="submit-new-audit-lop-text">Add Log Entry</button>
+ </form> <!-- end of new audit log form -->
+ </section> <!-- end of line item audit logs -->
+ </aside> <!-- end of line item extended view -->
+</article> <!-- end of line item -->
+</div>
diff --git a/d2ice.att.io/app/main/dashboard/checklist/checklist.less b/d2ice.att.io/app/main/dashboard/checklist/checklist.less
new file mode 100755
index 00000000..5e0d228e
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/checklist/checklist.less
@@ -0,0 +1,826 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+.cl-action-button{
+ width: 30%;
+ margin-bottom: 2%;
+ margin-right: 3%;
+ &:last-child {
+ margin-right: 0;
+ }
+
+}
+#main .popover {
+ max-width: 330px;
+}
+// Pop over rules
+.popover {
+ border: 2px solid #15B3E8;
+ .m_14_r;
+ z-index:100000;
+}
+
+.popover .popover-title {
+ background-color: white;
+ margin-top: 5px;
+ .a_18_m;
+ padding: 5px 10px;
+}
+
+.popover .popover-content {
+ padding: 5px 10px;
+ .m_16_r;
+}
+.popover .popover-content ul{
+ list-style-type: none;// square;
+ padding-left:0px;
+ margin-left:0px;
+ .m_16_r;
+ word-wrap: break-word;
+}
+.cl-action-control {
+ padding-left:8%
+}
+
+.checkList {
+ height:100%;
+ > #checklist-main-section {
+ height:80% !important;
+ }
+
+ .blocked-area {
+ pointer-events: none;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ background-color: white;
+ }
+
+ #modal_header_checklist {
+ margin-top:0px;
+ padding: 0 29px;
+ }
+
+ #modal-header-checklist-15 {
+ margin-top:0px;
+ padding: 0 15px;
+ }
+
+ .rows {
+
+ }
+
+
+ .font-deco {
+ text-decoration-line: underline;
+ text-decoration-style: dashed;
+ }
+
+ .lineColor
+ {
+ background-color:#F6F3F3;
+ }
+
+ .font_header
+ {
+ .m_18_m;
+ }
+
+ .font_header_chk_name
+ {
+ .m_18_r;
+ }
+
+ .font_user_name
+ {
+ .m_18_m;
+ }
+
+ .font_date
+ {
+ .m_14_r;
+ }
+
+ .font_line
+ {
+ border-bottom: 1px solid grey;
+ }
+
+ .font_desc
+ {
+ .m_16_r;
+ text-align:left;
+ }
+
+ .pad0
+ {
+ padding:0px;
+ }
+
+ .dash
+ {
+ border-bottom: dashed 1px;
+ border-color: @main_color_q;
+ padding: 0px;
+ }
+
+ .italic
+ {
+ font-style:italic;
+ }
+
+
+ #modal-title {
+ margin: 0px;
+ }
+
+ .checkList-form {
+ max-height: 100%;
+ //overflow-y: auto;
+ //overflow-x: hidden;
+
+ #audit-log-lines {
+
+ }
+
+
+ #checklist-subject
+ {
+ padding:0 15px;
+ margin-bottom: 0px;
+ }
+
+ .checklist-modal-multi-select {
+ margin-top: 1%;
+
+ .btn-group .btn {
+ .m_14_m;
+ }
+ }
+
+ .btn {
+ width: 100%;
+ }
+
+ .action-buttons{
+ width: 100%;
+ margin-bottom: 7px;
+ }
+
+ .col-no-pad
+ {
+ padding:0px;
+ }
+
+ .col-no-top
+ {
+ margin:0px 0px 0px 0px;
+ }
+
+ .text-right
+ {
+ text-align:right;
+ }
+
+ .modal-header {
+ display: flex;
+ flex-direction: row;
+
+ h2, h3 {
+ display: inline-block;
+ flex-grow: 10;
+ }
+ }
+
+ .font_title
+ {
+ .a_16_m;
+ }
+
+ .add-icon {
+ .sprite;
+ .sprite.add;
+ display: inline-block;
+ }
+
+
+ .add-button {
+ margin-top: 8px;
+ display: block;
+ .add-text {
+ .a_16_m;
+ vertical-align: top;
+ margin-left: 6px;
+ }
+
+ }
+
+ .margin_btm
+ {
+ margin-bottom:12px;
+ }
+
+ .margin_top
+ {
+ margin-top:12px;
+ }
+
+ .margin_btm5
+ {
+ margin-bottom: 5px;
+ }
+
+
+ .personImage
+ {
+ .profiles-sprite;
+ .profiles-sprite.profile-large;
+ display: block;
+ }
+
+ .table{
+ margin-bottom: 0;
+ }
+
+ .table-container-flex {
+
+ .data-row-wrapper {
+ padding: 10px 20px;
+ }
+
+ .flex-item:nth-child(1) {
+ padding-left: 0;
+ flex-grow: 25;
+ }
+
+ .flex-item:nth-child(2) {
+ flex-grow: 25;
+ }
+
+ .flex-item:nth-child(3) {
+ flex-grow: 25;
+ }
+
+ .flex-item:nth-child(4) {
+ flex-grow: 25;
+ }
+
+ }
+
+ .table-container-flex-a {
+
+ .data-row-wrapper {
+ padding: 10px 20px;
+ }
+
+ .flex-item-a:nth-child(1) {
+
+ padding-left: 0;
+ flex-grow: 40;
+ width:90%;
+ float:left;
+ }
+
+ .flex-item-a:nth-child(2) {
+
+ flex-grow: 25;
+ width:10%;
+ float:left;
+ }
+ }
+ //.a_16_m;
+
+ .remove-icon {
+ cursor: pointer;
+ vertical-align: text-top;
+ //.sprite;
+ //.sprite.delete;//-circle;
+ .actions-sprite;
+ .actions-sprite.delete_large;
+
+ display:block;
+ position:relative;
+ top:11px;
+ }
+
+
+
+
+ //.btn-primary-with-margin {
+ // border: 1px solid #8799A3;
+ // border-radius: 6px;
+ // background: #1E79B0; /* For browsers that do not support gradients */
+ // background: -webkit-linear-gradient(#1E79B0, #62ADD5); /* For Safari 5.1 to 6.0 */
+ // background: -o-linear-gradient(#1E79B0, #62ADD5); /* For Opera 11.1 to 12.0 */
+ // background: -moz-linear-gradient(#1E79B0, #62ADD5); /* For Firefox 3.6 to 15 */
+ // background: linear-gradient(#1E79B0, #62ADD5); /* Standard syntax (must be last) */
+ // margin-bottom:7px;
+ //}
+ //
+ //.btn-primary {
+ // border: 1px solid #8799A3;
+ // border-radius: 6px;
+ // background: #1E79B0; /* For browsers that do not support gradients */
+ // background: -webkit-linear-gradient(#1E79B0, #62ADD5); /* For Safari 5.1 to 6.0 */
+ // background: -o-linear-gradient(#1E79B0, #62ADD5); /* For Opera 11.1 to 12.0 */
+ // background: -moz-linear-gradient(#1E79B0, #62ADD5); /* For Firefox 3.6 to 15 */
+ // background: linear-gradient(#1E79B0, #62ADD5); /* Standard syntax (must be last) */
+ //}
+
+
+ .flex-item-a:nth-child(0) {
+ padding-left: 0;
+ flex-grow: 40;
+ width:80%
+ }
+
+ .flex-item-a:nth-child(1) {
+ flex-grow: 25;
+ width:20%;
+ }
+
+ //.content {
+
+ .steps-progress-wrapper {
+ margin-top: 10px;
+ }
+
+ .fnt
+ {
+ font-size:20px;
+ }
+
+ h1 {
+ .a_36;
+ margin: 0 0 30px 0;
+ }
+
+ h3 {
+ .m_18_m;
+ }
+ h2 {
+ margin: 0 0 10px 0;
+ .a_24_m;
+ position: relative;
+ .add-people,
+ .add-step {
+ .sprite;
+ .sprite.add;
+ display: inline-block;
+ margin-left: 8px;
+ cursor: pointer;
+ }
+ }
+
+ .main-section {
+ margin-top: 30px;
+ }
+ }
+
+ // dashboard css
+ padding:0 20px;
+
+ #state-bar {
+ float:none;
+ height: 5%;
+
+ }
+ #state-bar > ul {
+ border-bottom: dashed 1px;
+ border-color: @main_color_q;
+ padding-bottom:2px;
+ }
+ #state-bar > ul > li {
+ .m_14_r;
+ text-transform: uppercase;
+ text-align: left;
+ }
+ #state-bar > ul > li.active {
+ font-family:@font-omnes-bold;
+ }
+
+ #state-bar > ul > li > .state-icon {
+ display: inline-block;
+ position: relative;
+ top: 2px;
+ margin-right:5px;
+ }
+
+ #cl-header {
+ height:12%;
+ padding-top:1%;
+ }
+
+ #cl-header > #cl-title {
+ padding-left: 0px;
+ .a_24;
+ }
+ #cl-header > #cl-title > span.bold {
+ .a_24_m;
+ }
+ #cl-header > #cl-title > #edit-checklist {
+ display: inline-block;
+ margin-right: 5px;
+ cursor: pointer;
+ }
+
+ #cl-side-actions {
+ list-style: none;
+ margin-top: 5px;
+ }
+
+
+ #cl-side-actions > li {
+ display:inline-block;
+ margin-left:5px;
+ .n_12_m;
+ }
+
+ .cl-action-buttons-frame{
+
+ list-style: none;
+ text-align: right;
+ }
+
+ .cl-btn-associated {
+ border-bottom: 1px solid;
+ border-color: @main_color_l;
+ .a_26_m;
+ }
+
+ .cl-btn-cl-audit {
+ margin-right: 15%;
+ border-bottom: 1px solid;
+ border-color: @main_color_l;
+ }
+
+
+ #state-actions {
+ display: inline-block;
+ border-bottom: 1px solid;
+ border-color: @main_color_q;
+ padding-bottom: 5px;
+ }
+ #state-actions button {
+ margin-left: 10px;
+ }
+ #state-actions button:first-child {
+ margin-left: 0px;
+ }
+ #cl-side-actions span {
+ cursor: pointer;
+ border-bottom: 2px solid @main_color_m;
+ //text-transform: uppercase;
+ border-bottom: 1px solid;
+ border-color: @main_color_q;
+
+ }
+
+
+ #line-item-list {
+ list-style: none;
+ padding-right:15px;
+ }
+
+
+ #line-item-list > li {
+ margin-bottom: 25px;
+ }
+ #line-item-list > li > h2 {
+ text-transform: capitalize;
+ border-bottom: 1px solid;
+ border-color: @main_color_q;
+ width: 100%;
+ margin-bottom: 0px;
+ padding-left: 5px;
+ .m_24;
+ }
+ #line-item-list > li > h2 > span.bold {
+ .m_24_m;
+ }
+
+ #line-item-list > li > ul {
+ list-style: none;
+ }
+ #line-item-list > li > ul >li.line-item-row {
+ border-bottom: 1px solid;
+ border-color: @main_color_q;
+ line-height: 30px;
+ padding: 0px;
+ vertical-align: middle;
+ height: 30px;
+ .m_16_r;
+ cursor: pointer;
+ }
+
+ #line-item-list > li > ul >li.line-item-row .value-icon {
+ padding: 0px;
+ }
+
+ #line-item-list > li > ul >li.line-item-row .value-icon span {
+ display: inline-block;
+ position: relative;
+ top: 3px;
+ margin-right: 5px;
+ margin-left: 3px;
+ width:15px;
+ height:15px;
+ }
+
+ #line-item-list > li > ul >li.line-item-row .auto-icon {
+ text-align:right;
+ padding: 0px;
+ }
+
+ #line-item-list > li > ul >li.line-item-row .auto-icon span {
+ display: inline-block;
+ position: relative;
+ top: 3px;
+ margin-right: 3px;
+ }
+
+ #line-item-list > li > ul >li.line-item-row.selected-line {
+ background-color: @bg_color_a;
+ border-left: 2px solid;
+ border-top: 2px solid;
+ border-bottom: 2px solid;
+ border-color: @main_color_a;
+ position:relative;
+ z-index:1;
+ top: -1px;
+ left: -2px;
+ }
+
+ #line-item-list > li > ul >li.line-item-row.selected-line > .selected-line-connector {
+ position: absolute;
+ right: -19px;
+ width: 20px;
+ height: 30px;
+ top: -2px;
+ background-color: @bg_color_a;
+ border-top: 2px solid;
+ border-bottom: 2px solid;
+ border-color: @main_color_a;
+ }
+ #line-item-extended {
+ background-color: @bg_color_a;
+ border: 2px solid;
+ border-color: @main_color_a;
+ padding:15px;
+ @media (min-width: 992px) {
+ max-height: 100%;
+ overflow-y: auto;
+ }
+ }
+ #line-item-extended >header {
+ padding: 0 30px;
+ padding-bottom: 0px;
+ }
+ #line-item-extended >header > h2 {
+ text-transform: capitalize;
+ padding:0px;
+ margin:0px;
+ line-height:32px;
+ .m_18_r;
+ }
+ #line-item-extended > header > h2 > span.bold {
+ .m_18_m;
+ }
+ #line-item-extended >header > #decision-actions {
+ list-style: none;
+ text-align: right;
+ margin:0px;
+ }
+ #line-item-extended >header > #decision-actions > li {
+ display: inline-block;
+ margin-left: 2px;
+ .sprite;
+ }
+ #line-item-extended >header > #decision-actions.active > li {
+ cursor:pointer;
+ }
+
+ #line-item-extended >header > #decision-actions > li.not-relevant-btn {
+ .sprite.not-relevant-btn;
+ }
+
+ #line-item-extended >header > #decision-actions.active > li.not-relevant-btn:hover {
+ .sprite.not-relevant-btn-active;
+ }
+ #line-item-extended >header > #decision-actions > li.not-relevant-btn.active {
+ .sprite.not-relevant-btn-active;
+ }
+ #line-item-extended >header > #decision-actions > li.denied-cl-btn {
+ .sprite.denied-cl-btn;
+ }
+ #line-item-extended >header > #decision-actions.active > li.denied-cl-btn:hover {
+ .sprite.denied-cl-btn-active;
+ }
+ #line-item-extended >header > #decision-actions > li.denied-cl-btn.active {
+ .sprite.denied-cl-btn-active;
+ }
+ #line-item-extended >header > #decision-actions > li.approved-cl-btn {
+ .sprite.approved-cl-btn;
+ }
+ #line-item-extended >header > #decision-actions.active > li.approved-cl-btn:hover {
+ .sprite.approved-cl-btn-active;
+ }
+ #line-item-extended >header > #decision-actions > li.approved-cl-btn.active {
+ .sprite.approved-cl-btn-active;
+ }
+
+
+ #line-item-extended > #line-item-description {
+ margin: 0 15px;
+ .m_16_r;
+ }
+
+ #line-item-extended > #line-item-validation-instructions {
+ .m_14_r;
+ background-color: #fff;
+ border: 1px solid;
+ border-color: @main_color_a;
+ padding: 15px;
+ margin-top: 15px;
+ }
+
+ #line-item-extended > #line-item-validation-instructions h3 {
+ text-transform: capitalize;
+ margin: 0px;
+ .m_18_m;
+ }
+
+ #line-item-extended > #line-item-validation-instructions p {
+ margin-top: 5px;
+
+ }
+
+ #line-item-extended > #line-item-validation-instructions p ul {
+ padding-left: 15px;
+ }
+
+ #line-item-extended > #line-item-audit-logs {
+ padding:0 15px;
+ }
+
+ #line-item-extended > #line-item-audit-logs > h3 {
+ text-transform: capitalize;
+ .m_18_m;
+
+ }
+ #line-item-extended > #line-item-audit-logs > #audit-log-list {
+ list-style:none;
+
+ }
+ #line-item-extended > #line-item-audit-logs > #audit-log-list > li {
+ margin: 0 15px 10px;
+ border-bottom: 2px solid;
+ border-color: @main_color_q;
+ }
+ #line-item-extended > #line-item-audit-logs > #audit-log-list > li > .audit-creator {
+ .m_16_m;
+ margin:0px;
+ padding:0px;
+ }
+ #line-item-extended > #line-item-audit-logs > #audit-log-list > li > .audit-date {
+ text-align:right;
+ .m_14_r;
+ padding:0px;
+ }
+ #line-item-extended > #line-item-audit-logs > #audit-log-list > li > .audit-text {
+ .m_16_r;
+ margin-bottom:0px;
+ padding:0px;
+ }
+
+ #line-item-extended > #line-item-audit-logs > #new-audit-log-from {
+ margin: 0 0 15px;
+ }
+
+ #line-item-extended > #line-item-audit-logs > #new-audit-log-from #new-audit-log-text {
+ border-color: @main_color_q;
+ margin-bottom:15px;
+ }
+
+ .btn-gradient-primary {
+ font-weight: bold;
+ color: #FFFFFF;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #37B2E5;
+ *background-color: #37B2E5;
+ background-image: -moz-linear-gradient(top, #0079AB, #37B2E5);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0079AB), to(#37B2E5));
+ background-image: -webkit-linear-gradient(top, #0079AB, #37B2E5);
+ background-image: -o-linear-gradient(top, #0079AB, #37B2E5);
+ background-image: linear-gradient(to bottom, #0079AB, #37B2E5);
+ background-repeat: repeat-x;
+ border-color: #37B2E5;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0079AB', endColorstr='#37B2E5', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ }
+ .btn-sample:hover,
+ .btn-sample:focus,
+ .btn-sample:active,
+ .btn-sample.active,
+ .btn-sample.disabled,
+ .btn-sample[disabled] {
+ color: #FFFFFF;
+ background-color: #37B2E5;
+ *background-color: #003bb3;
+ }
+
+ .btn-gradient-success {
+ font-weight: bold;
+ color: #FFFFFF;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #41A02C;
+ *background-color: #41A02C;
+ background-image: -moz-linear-gradient(top, #A2E652, #41A02C);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#A2E652), to(#41A02C));
+ background-image: -webkit-linear-gradient(top, #A2E652, #41A02C);
+ background-image: -o-linear-gradient(top, #A2E652, #41A02C);
+ background-image: linear-gradient(to bottom, #A2E652, #41A02C);
+ background-repeat: repeat-x;
+ border-color: #41A02C;
+ border-color: #888;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#A2E652', endColorstr='#41A02C', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ }
+ .btn-sample:hover,
+ .btn-sample:focus,
+ .btn-sample:active,
+ .btn-sample.active,
+ .btn-sample.disabled,
+ .btn-sample[disabled] {
+ color: #FFFFFF;
+ background-color: #41A02C;
+ *background-color: #003bb3;
+ }
+
+ .btn-gradient-danger {
+ font-weight: bold;
+ color: #FFFFFF;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #AE0020;
+ *background-color: #AE0020;
+ background-image: -moz-linear-gradient(top, #F74658, #AE0020);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#F74658), to(#AE0020));
+ background-image: -webkit-linear-gradient(top, #F74658, #AE0020);
+ background-image: -o-linear-gradient(top, #F74658, #AE0020);
+ background-image: linear-gradient(to bottom, #F74658, #AE0020);
+ background-repeat: repeat-x;
+ border-color: #AE0020;
+ border-color: #888;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#F74658', endColorstr='#AE0020', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ }
+ .btn-sample:hover,
+ .btn-sample:focus,
+ .btn-sample:active,
+ .btn-sample.active,
+ .btn-sample.disabled,
+ .btn-sample[disabled] {
+ color: #FFFFFF;
+ background-color: #AE0020;
+ *background-color: #003bb3;
+ }
+
+
+
+
+}
diff --git a/d2ice.att.io/app/main/dashboard/dashboard/dashboard.controller.js b/d2ice.att.io/app/main/dashboard/dashboard/dashboard.controller.js
new file mode 100755
index 00000000..b6183b79
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/dashboard/dashboard.controller.js
@@ -0,0 +1,235 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+ 'use strict';
+ angular
+ .module('ice.dashboard.dashboard',['angularUtils.directives.dirPagination', 'ngFileSaver'])
+ .controller('DashboardMainController', ["$rootScope", "pageService", "stepsService", "vfService", "usersService",
+ "iceConstants", "localStorageService", "FileSaver", "Blob", "cmsService", "$uibModal", "$log", dashboardMainController]);
+
+ function dashboardMainController($rootScope, pageService, stepsService, vfService, usersService, iceConstants,
+ localStorageService, FileSaver, Blob, cmsService, $uibModal, $log) {
+ var vm = this;
+
+ var init = function () {
+ pageService.setPage('dashboard');
+ cmsService.setAnnouncementToast();
+ localStorageService.setJson("ice.settings.eng_uuid",undefined);
+ vm.stages = iceConstants.stages;
+ vm.stages.all = 'All';
+ vm.search_keyword = '';
+ vm.search_stage = 'All';
+ vm.statistic_stage_filter = 'All';
+ vm.current_starting_offset = "0";
+ vm.num_of_returned_items = 0;
+ vm.pagination_num_of_objects = 8;
+ vm.me = vm.user = usersService.getUserData();
+ vm.isAdminRo = usersService.isUserInRole(iceConstants.roles.admin_ro);
+ vm.isEngagmentEL = usersService.isUserInRole(iceConstants.roles.el);
+ vm.isEngagmentLead = usersService.isEngagementEL(vm.team);
+ vm.isAdmin = usersService.isAdmin(vm.me);
+ vm.page_num = 1;
+ vm.searchEngagements(1);
+ vm.request_statistics_data();
+ getUserNextSteps();
+ };
+
+ vm.request_statistics_data = function(){
+ vfService.getEngagements(vm.me.uuid)
+ .then(function (response) {
+ if (response.status === 200 && response.data && response.data !== '') {
+ vm.enagements_search_list = response.data;
+ var vfc_array = undefined;
+ var vfc_num = 0;
+ var eng_num = 0;
+ vm.enagements_search_list.forEach(function (engagement) {
+ if(vm.statistic_stage_filter == "All") {
+ eng_num++;
+ if (engagement.engagement_stage == "Validated" || engagement.engagement_stage == "Completed") {
+ if (engagement.vfc.length > 1) {
+ vfc_array = engagement.vfc.split(", ").length;
+ vfc_num += vfc_array;
+ }
+ }
+ }
+ else {
+ if(engagement.engagement_stage == vm.statistic_stage_filter){
+ eng_num++;
+ if (engagement.vfc.length > 1 && (engagement.engagement_stage == "Validated" || engagement.engagement_stage == "Completed")) {
+ vfc_array = engagement.vfc.split(", ").length;
+ vfc_num += vfc_array;
+ }
+ }
+ }
+
+ });
+
+ vm.vfc_num = vfc_num;
+ vm.eng_num = eng_num;
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+
+ };
+
+ vm.onStageChange = function() {
+ vm.page_num = 1;
+
+ vm.searchEngagements();
+ };
+
+ vm.onKeywordChange = function() {
+ vm.page_num = 1;
+
+ vm.searchEngagements();
+ };
+
+ vm.searchEngagements = function () {
+ vm.current_starting_offset = (vm.page_num-1)*vm.pagination_num_of_objects;
+ vm.postData = {'stage': vm.search_stage, 'keyword': vm.search_keyword, 'offset': vm.current_starting_offset, 'limit': vm.pagination_num_of_objects};
+ vfService.getExpandedEngagements(vm.postData)
+ .then(function (response) {
+ if (response.status === 200 && response.data && response.data !== '') {
+ vm.vf_search_list = response.data['array'];
+ vm.num_of_returned_items = response.data['num_of_objects'];
+ vm.vf_search_list.forEach(function (vf){
+ var progress_needed_data = {
+ enable_edit: false,
+ completion_date: vf.engagement__target_completion_date,
+ ecomp_release: vf.ecomp_release__name,
+ vnf_version: vf.version,
+ aic_version: vf.deployment_target__version,
+ aic_instantiation_time:vf.engagement__aic_instantiation_time,
+ asdc_onboarding_time:vf.engagement__asdc_onboarding_time,
+ heat_validated_time:vf.engagement__heat_validated_time,
+ image_scan_time: vf.engagement__image_scan_time,
+ engagement_uuid: vf.engagement__uuid,
+ manual_id: vf.engagement__engagement_manual_id,
+ name: vf.vf__name,
+ starred: false
+ };
+ vf.progress_needed_data = progress_needed_data;
+ vf.starred_users.forEach(function (user) {
+ if (vm.me.uuid == user) {
+ vf.progress_needed_data.starred = true;
+ }
+ });
+
+
+ });
+ vm.vf_display_list = vm.vf_search_list;
+
+ addStatusesLoadedAttr();
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ };
+
+ vm.goToEngagement = function(uuid){
+ $rootScope.$broadcast('searchSelectEngagement',uuid);
+ };
+
+ vm.exportEngagementCSV = function() {
+ var stage = vm.search_stage || "";
+ var keyword = vm.search_keyword || "";
+ $rootScope.ice.loader.show = true;
+
+ vfService.exportEngagementsCSV(stage, keyword)
+ .then(function(response) {
+ if(response && response.data) {
+ var data = new Blob([response.data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
+ FileSaver.saveAs(data, 'D2Ice.xlsx');
+ $rootScope.ice.loader.show = false;
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ };
+
+ vm.openCMSReadMoreModal = function(cmsPost) {
+ if(cmsPost) {
+ $uibModal.open({
+ templateUrl: 'main/modals/cms-post-modal/cms-post-modal.html',
+ controller: 'cmsPostModalController',
+ controllerAs: 'vm',
+ size: 'cms-post-read-more',
+ resolve: {
+ post: function () {
+ return cmsPost;
+ }
+ }
+ });
+ } else {
+ $log.warn("Cannot open cms post.")
+ }
+ };
+
+ function getUserNextSteps() {
+ vm.userNextSteps = [];
+
+ stepsService.getByUser()
+ .then(function(response) {
+ vm.userNextSteps = response.data.data;
+ vm.userNextStepsCount = response.data.count;
+ })
+ .catch(function (error) {
+ $log.error(error);
+ });
+ };
+
+ function addStatusesLoadedAttr() {
+ angular.element(document).ready(function () {
+ var statusesTitleElement = angular.element( document.querySelector('#dashboard-title'));
+ if(statusesTitleElement && statusesTitleElement.length === 1) {
+ statusesTitleElement.attr('list-loaded', 'true');
+ }
+ });
+ };
+
+ init();
+ }
+})();
diff --git a/d2ice.att.io/app/main/dashboard/dashboard/dashboard.html b/d2ice.att.io/app/main/dashboard/dashboard/dashboard.html
new file mode 100755
index 00000000..c03251b9
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/dashboard/dashboard.html
@@ -0,0 +1,111 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<div class="dashboard-view row">
+ <div class="col-md-8 " id="dashboard-main-panel">
+ <header class="row col-md-12" id="dashboard-header">
+ <h1 class="col-md-4" id="dashboard-title">Statuses</h1>
+ <span class="col-md-8 search-filters">
+ Stage
+ <select id="search-filter-stage" class="form-control search-filter-stage" ng-model="vm.search_stage" ng-change='vm.onStageChange()' ng-options="stage for stage in vm.stages ">
+ <option value="all" selected>All</option>
+ <option value="Intake">Intake</option>
+ <option value="Active">Active</option>
+ <option value="3">3</option>
+ </select>
+ <input type="text"
+ id="search-filter-keyword"
+ ng-model="vm.search_keyword"
+ ng-model-options="{ debounce: 150 }"
+ placeholder="Search by EID, VF or VFC"
+ class="form-control"
+ ng-change='vm.onKeywordChange()'
+ >
+ </span>
+ </header>
+ <content class="row col-md-12" id="search-results">
+ <div class="col-md-12 progress-bar-row" dir-paginate="engagement in vm.vf_display_list | itemsPerPage: vm.pagination_num_of_objects" total-items="vm.num_of_returned_items" current-page="vm.page_num" track by engagement.engagement__uuid >
+ <progress-directive
+ progress="{{engagement.engagement__progress}}"
+ enable-edit=false
+ data="engagement.progress_needed_data"
+ statuses=true
+ enable-refresh=false>
+ </progress-directive>
+ </div>
+ <span class="col-md-12" id="export-to-csv" ng-click="vm.exportEngagementCSV()">Export to Excel >></span>
+ <dir-pagination-controls on-page-change="vm.searchEngagements()" class="col-md-12" id="engagements-pagination"></dir-pagination-controls>
+ </content>
+ </div>
+ <aside class="col-md-4 " id="dashboard-side-panel">
+ <div class="col-md-12" id="assgined-nextsteps">
+ <div id="next-steps-header">Assigned To You ({{vm.userNextStepsCount}})</div>
+ <ul id="next-steps-list">
+ <h4 class="engagement-title" ng-if="vm.userNextSteps.length == 0">No next steps are assigned to you.</h4>
+ <li data-ng-repeat="step in vm.userNextSteps | orderBy: 'due_date'" class="next-step-details">
+ <div class="next-step-details-header row">
+ <h2 class="engagement-title col-md-8" name="{{step.engagement_manual_id}}" ng-click="vm.goToEngagement(step.engagement_uuid)">Engagement - <span class="engagement-name">{{step.engagement_manual_id}}: {{step.vf_name}}</span></h2>
+ <span class="due-date col-md-4">
+ <i class="fa fa-clock-o"></i>
+ <span class="due-date-icon" name="duedate-{{step.due_date}}"></span>{{step.due_date | date2: 'EEEE MMMM doo yyyy'}}
+ </span>
+ </div>
+ <p class="next-step-description" name="description-{{step.engagement_manual_id}}" ng-bind-html="step.description | htmlspecialchars"></p>
+ <span class="next-step-creation" name="creator-full-name-{{step.creator_full_name}}">Added at {{step.create_time | date2: 'EEEE MMMM doo yyyy'}} by {{step.creator_full_name}}</span>
+ </li>
+ </ul>
+ </div>
+ <div class="line-seperator col-md-12" data-ng-if="vm.isEngagmentEL || vm.isAdmin || vm.isAdminRo" ></div>
+ <div class="col-md-12" data-ng-if="vm.isEngagmentEL || vm.isAdmin || vm.isAdminRo" id="statistics">
+ <div id="statistics-header" class="row">
+ <h2 class="col-md-4">Statistics</h2>
+ <span class="col-md-8 search-filters">
+ Stage
+ <select class="search-filter-stage" ng-model="vm.statistic_stage_filter" ng-change='vm.request_statistics_data()' ng-options="stage for stage in vm.stages "></select>
+ </span>
+ </div>
+
+ <div id="statistics-list" class="row">
+ <span class="col-md-8 statistic-name">Validations</span><span class="col-md-4 statistic-count" id="id-validations-num">{{vm.vfc_num}}</span>
+ <span class="col-md-8 statistic-name">Engagements</span><span class="col-md-4 statistic-count" id="id-engagements-num">{{vm.eng_num}}</span>
+ </div>
+ </div>
+ <div class="line-seperator col-md-12"></div>
+ <ice-news-and-announcement limit="5" show-description="true"></ice-news-and-announcement>
+ </aside>
+</div>
diff --git a/d2ice.att.io/app/main/dashboard/dashboard/dashboard.less b/d2ice.att.io/app/main/dashboard/dashboard/dashboard.less
new file mode 100755
index 00000000..4c824796
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/dashboard/dashboard.less
@@ -0,0 +1,189 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ .dashboard .content-container #content {
+ height: 100%;
+ overflow-y: auto;
+ }
+.dashboard-view {
+ padding: 10px;
+
+ .steps-progress-wrapper {
+ border:none;
+ background-color: @main_color_p;
+ }
+
+
+ #dashboard-main-panel {
+ #dashboard-header {
+ #dashboard-title {
+ .a_26_m;
+ margin:0px;
+ line-height:40px;
+ }
+ .search-filters {
+ text-align: right;
+ .m_16_m;
+ line-height:40px;
+ .search-filter-stage {
+ margin-left:10px;
+ display: inline-block;
+ width: 40%;
+ }
+ #search-filter-keyword {
+ margin-left:10px;
+ display: inline-block;
+ width: 40%;
+ }
+
+ }
+ }
+ #search-results {
+ .progress-bar-row {
+ padding:0px;
+ }
+
+ .progress-bar-row:nth-child(even) .steps-progress-wrapper {
+ background-color: @func_color_r;
+ }
+
+ #export-to-csv {
+ text-align : right;
+ .m_14_m;
+ text-decoration: underline;
+ cursor:pointer;
+ }
+ #engagements-pagination {
+ text-align:center;
+ .pagination {
+ margin:0px;
+ }
+ }
+
+ }
+
+ }
+ #dashboard-side-panel {
+ border-left: solid 1px @main_color_gray;
+
+ #assgined-nextsteps {
+ border: 1px solid @toolbar_background_color;
+ padding:0px;
+
+ #next-steps-header {
+ background-color: @toolbar_background_color;
+ .p_22_m;
+ padding: 10px 10px 0;
+ }
+ #next-steps-list {
+ list-style:none;
+ padding: 0 15px;
+ .next-step-details {
+ border-bottom: 1px dashed @main_color_a;
+ padding-bottom:10px;
+
+ .next-step-details-header {
+ .engagement-title {
+ cursor:pointer;
+ .m_14_m;
+ margin-top: 15px;
+ margin-bottom: 0px;
+ .engagement-name {
+ text-decoration: underline;
+ }
+ }
+ .due-date {
+ .m_14_m;
+ margin-top: 10px;
+ margin-bottom: 0px;
+ text-align:right;
+ .due-date-icon {
+ }
+ }
+ }
+ .next-step-description {
+ .m_18_r;
+ margin: 3px 0px;
+ line-height: 20px;
+ }
+ .next-step-creation {
+ .m_14_r;
+ }
+
+ }
+ .next-step-details:last-child {
+ padding:0px;
+ border:none;
+ }
+ }
+ }
+ .line-seperator {
+ border-bottom: dashed 1px @main_color_gray;
+ margin: 20px 0;
+ }
+ #statistics {
+
+ border: 1px solid @main_color_gray;
+ padding:15px;
+
+ #statistics-header {
+ margin-bottom: 10px;
+ h2 {
+ .m_24_m;
+ color: @main_color_gray;
+ margin: 0px;
+ }
+ .search-filters {
+ text-align: right;
+ .search-filter-stage {
+ margin-left:10px;
+ width:50%;
+
+ }
+ }
+ }
+ #statistics-list {
+ .statistic-name {
+ }
+ .statistic-count {
+ text-align:right;
+ }
+ }
+ }
+ }
+}
diff --git a/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.controller.js b/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.controller.js
new file mode 100755
index 00000000..c8af53f7
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.controller.js
@@ -0,0 +1,245 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+ 'use strict';
+ angular
+ .module('ice.dashboard.main')
+ .controller('detailedViewController', ["$rootScope", "$stateParams", "vfcService", "dtsiteService", "usersService",
+ "$uibModal", "vfService", "$log", "_", detailedViewController]);
+
+ function detailedViewController($rootScope, $stateParams, vfcService, dtsiteService, usersService, $uibModal, vfService, $log, _) {
+ var vm = this;
+
+ var init = function () {
+ $rootScope.timeGapLocal = moment().format("z");// timeGap();
+ $rootScope.ampm = moment().format('A');
+ $rootScope.mom = moment().tz(moment.tz.guess()).format('z');
+ vm.is_aic_edit_mode = false;
+ vm.is_ecomp_edit_mode = false;
+ vm.aic_loaded = false;
+ vm.ecomp_loaded = false;
+
+ if($stateParams.engagement != undefined) {
+ vm.engagement = $stateParams.engagement;
+ }
+
+ if (vm.engagement != undefined)
+ {
+ vm.me = usersService.getUserData();
+ vfService.getSingleEngagement(vm.me.uuid,vm.engagement.uuid)
+ .then(function (response) {
+ $rootScope.ice.loader.show = false;
+
+ if (response.status === 200 && response.data && response.data !== '') {
+ var vf_data = response.data;
+
+ vm.engagement_manual_id = vf_data.engagement.engagement_manual_id;
+ vm.vf_name = vf_data.name;
+ vm.vf_version = vf_data.version;
+ vm.vf_uuid = vf_data.uuid;
+ vm.ecomp_release = vf_data.ecomp_release;
+ vm.target_lab = new Date(vf_data.target_lab_entry_date);
+ vm.dtversion = vf_data.deployment_target;
+ vm.selected_dt_uuid = vm.dtversion.uuid;
+ vm.selected_ecomp_uuid = vm.ecomp_release.uuid;
+ vm.me = usersService.getUserData();
+ vm.name = vm.engagement.name;
+ vm.isEngagementEL = usersService.isEngagementEL(vf_data.engagement.engagement_team);
+ vm.isAdmin = usersService.isAdmin(vm.me);
+ initDTsites();
+ initVfcs();
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+
+ }
+ };
+
+
+ vm.addVfc = function () {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/detailed-view/vfc/detailed-view-vfc-modal.html',
+ controller: 'detailedViewVFCModalController',
+ controllerAs: 'vm',
+ resolve: {
+ vf_uuid: function () {
+ return vm.vf_uuid;
+ },
+ }
+ });
+ modalInstance.result.then(function (data) {
+ if (data) {
+ initVfcs();
+ }
+ });
+ };
+ this.personArray = [vm.dtversion,vm.vf_uuid];
+
+ vm.editValidationDetails = function () {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/validation-details/detailed-view-validation-details-modal.html',
+ controller: 'validationDetailsModalController',
+ controllerAs: 'vm',
+ resolve: {
+ vf_uuid: function () {
+ return vm.vf_uuid;
+ }
+ }
+ });
+ modalInstance.result.then(function (data) {
+ if (data) {
+ init();
+ }
+ });
+ };
+
+ vm.addDTS = function () {
+ if(vm.isEngagementEL || vm.isAdmin) {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/detailed-view/dtsite/detailed-view-dtsites-modal.html',
+ controller: 'detailedViewDtsitesModalController',
+ controllerAs: 'vm',
+ resolve: {
+ vf_uuid: function () {
+ return vm.vf_uuid;
+ },
+ }
+ });
+
+ modalInstance.result.then(function (data) {
+ if (data) {
+ if(data === 200) {
+ initDTsites();
+ }
+ }
+ });
+ }
+ };
+
+
+ vm.changeTargetLabEntry = function(){
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/target-lab-entry/change-lab-entry-date.html',
+ controller: 'ChangeLabEntryDateModalController',
+ controllerAs: 'vm',
+ resolve: {
+ targetLabDate: function () {
+ return vm.target_lab;
+ },
+ engagementUuid: function () {
+ return vm.engagement.uuid;
+ }
+ }
+ });
+ modalInstance.result.then(function (data) {
+ if (!data){
+ return;
+ }
+ else {
+ vm.target_lab = new Date(data.target_date);
+ $log.debug("data.target_date",data.target_date)
+ $log.debug("vm.target_lab",vm.target_lab)
+ }
+ }, function () {
+ $log.error('Modal dismissed at: ' + new Date());
+ });
+ };
+ //In case user press the delete icon next to a VFC, this function would be activated
+ vm.deleteVfc = function(vfc_uuid){
+ vfcService.delete(vfc_uuid,vm.vf_uuid)
+ .then(function (response) {
+ if (response.status === 204) {
+ initVfcs();
+ }
+ })
+ .catch(function (error) {
+ $log.error(error);
+ });
+ };
+
+ vm.deleteDTSite = function(vfUuid, dtsUuid){
+ dtsiteService.delete(vm.vf_uuid, dtsUuid)
+ .then(function (response) {
+ if (response.status === 204) {
+ initDTsites();
+ }
+ })
+ .catch(function (error) {
+ $log.error(error);
+ });
+ };
+
+
+ var initDTsites = function() {
+ if(vm.isEngagementEL || vm.isAdmin) {
+ $rootScope.ice.loader.show = true;
+ dtsiteService.getVFSites(vm.vf_uuid)
+ .then(function (response) {
+ $rootScope.ice.loader.show = false;
+ if (response.status === 200) {
+ vm.dtsites = response.data;
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ }
+ };
+
+ var initVfcs = function() {
+ $rootScope.ice.loader.show = true;
+ vfcService.get(vm.vf_uuid)
+ .then(function (response) {
+ $rootScope.ice.loader.show = false;
+ if (response.status === 200) {
+ vm.vfcs = response.data;
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ };
+ init();
+ }
+})();
diff --git a/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.html b/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.html
new file mode 100755
index 00000000..02eb760a
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.html
@@ -0,0 +1,109 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<div id="detailed-view">
+ <div class="row">
+ <h1 ><span class="bold">{{vm.engagement_manual_id + ': '}}</span>{{vm.vf_name}} </h1>
+ </div>
+ <div class="vfc-main-section row">
+ <div class="col-xs-4 col-md-4 vfc-steps">
+ <div id="validation-details">
+ <div id="validation-details-header">
+ <span id="vd-title">Validation Details</span><span class="add-vdetails"></span>
+ <i class="edit-target-completion fa fa-pencil-square-o" id="update-validation-details" ng-click="vm.editValidationDetails()" class="add-vdetails" ></i>
+ </div>
+ <div id="validation-details-content">
+ <div >
+ <div class ="line ecomp_release_field " ng-if="!vm.is_ecomp_edit_mode"><span id="ecomp-release-headline">ECOMP Release:</span> <span id="ecomp_version_{{vm.ecomp_release.name}}">{{vm.ecomp_release.name}}</span></div>
+ </div>
+ <div>
+ <div class ="line dtversion_field" ng-if = "vm.is_aic_edit_mode === false"><span id="target-aic-version-headline">Target AIC Version:</span><span id="aic_version_{{vm.dtversion.version}}">{{vm.dtversion.version}}</span></div>
+ </div>
+ <div>
+ <div class ="line dtversion_field" ng-if = "vm.is_aic_edit_mode === false"><span id="vf-version-headline">VF Version: </span> <span id="vf_version_{{vm.vf_version}}">{{vm.vf_version}}</span></div>
+ </div>
+ </div>
+ </div>
+ <div id="target-lab-entry">
+ <div id="target-lab-entry-header">
+ <span>Target Lab Entry</span>
+ <i class="edit-target-completion fa fa-pencil-square-o" id="change-lab-entry-date" data-ng-click="vm.changeTargetLabEntry()" aria-hidden="true"></i>
+ </div>
+ <div id="target-lab-entry-content">
+ <h4 class="target-lab-entry-content">{{vm.target_lab | date:'shortDate'}}</h4>
+ </div>
+ </div>
+ <div id="deployment-targets">
+ <div id="deployment-targets-header">
+ <span>Deployment Targets </span><span ng-click="vm.addDTS()" class="add-vfc"></span>
+ <i class="edit-target-completion fa fa-pencil-square-o" id="add-dt" ng-show="vm.isEngagementEL || vm.isAdmin" ng-click="vm.addDTS()" class="add-vfc" aria-hidden="true"></i>
+ </div>
+ <div id="deployment-targets-content">
+ <ul>
+ <li class="step row" data-ng-repeat="dts in vm.dtsites track by dts.uuid" ng-mouseover="hoverEdit = true" ng-mouseleave="hoverEdit = false">
+ <span id="visible-dts-{{dts.name}}" class = "col-md-10">{{dts.name}}</span>
+
+ <span class = "remove-button col-md-2" ng-if="vm.dtsites.length > 0" ng-click='vm.deleteDTSite(vm.vf.uuid, dts.uuid)'>
+ <span ng-show="hoverEdit"><span id="remove-dts-{{dts.uuid}}" class="remove-icon"></span></span>
+ </span>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="col-xs-4 col-md-4 vfc-column">
+ <div id="virtual-function-components" ng-if="vm.isEngagementEL || vm.isAdmin" >
+ <div id="virtual-function-header">
+ <span>Virtual Function Components </span><span id="virtual-vfc" ng-click="vm.addVfc()" class="add-vfc"></span>
+ <i class="edit-target-completion fa fa-pencil-square-o" ng-show="vm.isEngagementEL || vm.isAdmin" id="add-vfc" ng-if="vm.isEngagementEL || vm.isAdmin" ng-click="vm.addVfc()" class = "add-vfc" ></i>
+ </div>
+ <div id="virtual-function-content">
+ <ul>
+ <li class="step row" data-ng-repeat="vfc in vm.vfcs track by vfc.uuid" ng-mouseover="hoverEdit = true" ng-mouseleave="hoverEdit = false">
+ <span id="visible-dts-{{vfc.name}}" class = "col-md-10"> {{vfc.name +' (' + vfc.external_ref_id + ')'}} </span>
+
+ <span class="remove-button col-md-2" ng-if="vm.vfcs.length > 0 && (vm.isEngagementEL || vm.isAdmin)" ng-click='vm.deleteVfc(vfc.uuid)'>
+ <span ng-show="hoverEdit"><span id="remove-vfc-{{vfc.uuid}}" class="remove-icon"></span></span>
+ </span>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
diff --git a/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.less b/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.less
new file mode 100755
index 00000000..dbac5c2d
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/detailed-view/detailed-view.less
@@ -0,0 +1,400 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#detailed-view {
+
+ padding:0px 30px 0px 30px;
+
+ .glyphicon-cursor-detailed-view {
+ cursor: pointer;
+ margin-left: 0.5%;
+ }
+
+ .detailed-view-edit-mode {
+ cursor: pointer;
+ margin-left: 0.5%;
+ display: inline-block;
+ position: relative;
+ top: 3px;
+ .sprite;
+ .sprite.edit-medium;
+ }
+
+ .hide-element {
+ display:none;
+ }
+
+ .show-select {
+ display:block;
+ margin-bottom: 3%;
+ }
+
+ .row > h1 {
+ padding: 0px;
+ margin-bottom: 0px;
+
+ .a_36;
+
+ .bold {
+ .a_36_m;
+ }
+ }
+
+ .remove-button {
+ height: 10px;
+ .a_16_m;
+ cursor: pointer;
+
+
+ .remove-icon {
+ .sprite;
+ .sprite.delete;
+ cursor: pointer;
+ display: block;
+ position: relative;
+ }
+ }
+
+ .steps-progress-wrapper {
+ margin-top: 10px;
+ }
+
+
+
+ h2 {
+ display: inline-block;
+ margin: 0 0 10px 0;
+ .a_24_m;
+ font-size: 20px;
+ position: relative;
+ .add-vfc {
+ .sprite;
+ .sprite.add;
+ display: inline-block;
+ margin-left: 8px;
+ cursor: pointer;
+ position: relative;
+ top: 3px;
+ }
+ }
+
+ .main-section {
+ margin-top: 30px;
+ }
+
+ .steps-header {
+
+ .steps-filter {
+ display: inline-block;
+ float: right;
+ .a_16_m;
+ .todo {
+ .sprite;
+ .sprite.todo;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .completed {
+ .sprite;
+ .sprite.pending;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .confirmed {
+ .sprite;
+ .sprite.approved;
+ display: inline-block;
+ cursor: pointer;
+ }
+ }
+ }
+
+ .vfc-column {
+ height: 100%;
+ padding-right: 20px;
+ padding-left: 20px;
+ padding-top: 20px;
+
+ ul {
+ li.step {
+
+ list-style: none;
+ position: relative;
+ padding: 5px 10px 0px 4px;
+ font-size: 16px;
+ }
+ }
+ }
+
+ .vfc-steps {
+ border-right: dashed 1px @main_color_a;
+ height: 100%;
+ padding-right: 20px;
+ padding-left: 0px;
+ padding-top: 20px;
+
+ ul {
+ li.step {
+
+ list-style: none;
+ position: relative;
+ padding: 5px 10px 0px 4px;
+ font-size: 16px;
+ &:hover {
+ background-color: #DEF3FF;
+
+ .details {
+ .actions {
+ span {
+ visibility: visible;
+ }
+ }
+ }
+
+ }
+
+ &.completed {
+ background-color: #dddddd;
+ opacity: 0.7;
+ }
+
+ .description {
+
+ .m_16_r;
+ border-bottom: dashed 1px @main_color_n;
+ padding: 10px 0;
+
+ input {
+ position: absolute;
+ top: 10px;
+ left: 0;
+ margin-right: 20px;
+ }
+
+ .step-text {
+ margin-left: 20px;
+ }
+
+ .step-state {
+
+ position: absolute;
+ top: 24px;
+
+ &.todo {
+ .steps-sprite;
+ .steps-sprite.todo;
+ display: inline-block;
+ }
+ &.confirmed {
+ .steps-sprite;
+ .steps-sprite.confirmed;
+ display: inline-block;
+ }
+ &.completed {
+ .steps-sprite;
+ .steps-sprite.completed;
+ display: inline-block;
+ }
+ &.completed-non-el {
+ .steps-sprite;
+ .steps-sprite.completed-non-el;
+ display: inline-block;
+ }
+ }
+
+ }
+ .details {
+ .m_12_r;
+ margin: 6px 0 10px 0;
+
+ .actions {
+ float: right;
+ margin-top: 2px;
+
+ span {
+ visibility: hidden;
+ }
+
+ .moveto-confirmed {
+ .actions-sprite;
+ .actions-sprite.approve_large;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .moveto-todo {
+ .actions-sprite;
+ .actions-sprite.reject_large;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .moveto-delete {
+ .actions-sprite;
+ .actions-sprite.delete_large;
+ display: inline-block;
+ cursor: pointer;
+ }
+ }
+ }
+ }
+ }
+
+ }
+ #deployment-targets {
+ border: 1px solid @engagement_team_color;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #deployment-targets-header {
+ background-color: @engagement_team_color;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+
+ .edit-target-completion {
+ font-size: 21px;
+ vertical-align: middle;
+ padding-left: 6px;
+ cursor:pointer;
+ }
+ }
+
+ #deployment-targets-content {
+ .f-type._16_r;
+ margin: 15px;
+ }
+ }
+ #virtual-function-components {
+ border: 1px solid @engagement_status_color;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #virtual-function-header {
+ background-color: @engagement_status_color;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+
+ .edit-target-completion {
+ font-size: 21px;
+ vertical-align: middle;
+ padding-left: 6px;
+ cursor:pointer;
+ }
+ }
+
+ #virtual-function-content {
+ .f-type._16_r;
+ margin: 15px;
+ }
+ }
+
+ #target-lab-entry {
+ border: 1px solid @target_completion_color;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #target-lab-entry-header {
+ background-color: @target_completion_color;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+
+ .edit-target-completion {
+ font-size: 21px;
+ vertical-align: middle;
+ padding-left: 6px;
+ cursor:pointer;
+ }
+ }
+
+ #target-lab-entry-content {
+ .f-type._16_r;
+ margin: 15px;
+ }
+ }
+ #validation-details {
+ border: 1px solid #4990E2;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #validation-details-header {
+ background-color: #4990E2;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+
+ .edit-target-completion {
+ font-size: 21px;
+ vertical-align: middle;
+ padding-left: 6px;
+ cursor:pointer;
+ }
+ }
+
+ #validation-details-content {
+ .f-type._16_r;
+ margin: 15px;
+ }
+ }
+ .team-and-logs {
+ height: 100%;
+ padding-left: 20px;
+ padding-top: 20px;
+ margin-left: -1px;
+ border-left: dashed 1px @main_color_a;
+
+ .line{
+ margin-bottom: 10px;
+ }
+
+ }
+
+ .add-next-step-form {
+ .ice-wysiwyg {
+ height: 200px;
+ .wysiwyg-menu > div {
+ background-color: #f1f1f1;
+ padding: 2px;
+ }
+ }
+ }
+
+ .vfc-main-section {
+ margin-top: 0px;
+ }
+}
diff --git a/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.directive.js b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.directive.js
new file mode 100755
index 00000000..3676e51c
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.directive.js
@@ -0,0 +1,308 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+ 'use strict';
+ angular
+ .module('ice.dashboard.get-started-modal')
+ .directive('getStartedModal', function () {
+ return {
+ restrict: 'AEC',
+ scope: {},
+ link: function (scope, elm, attrs) {
+ scope.$emit('openGettingStartedWizardLoaded');
+ },
+ controller: ['$rootScope', '$scope', '$uibModal', 'toastService', '$log',
+ function ($rootScope, $scope, $uibModal, toastService, $log) {
+
+ var gm = this;
+ gm.data = {};
+
+ gm.openModal = function () {
+ toastService.clearToast();
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/dashboard/get-started-modal/wizard/wizard-container.html',
+ controller: 'ModalCtrl',
+ controllerAs: 'wizard',
+ resolve: {
+ wizardData: function () {
+ return gm.wizardData;
+ }
+ },
+ backdrop: 'static'
+ });
+ };
+
+ $scope.$on('openGettingStartedWizard', function (event, args) {
+
+ gm.wizardData = args;
+ gm.openModal();
+ });
+ }],
+ controllerAs: 'gm'
+ };
+ })
+ .controller('ModalCtrl', ['$rootScope', '$scope', '$uibModalInstance', 'vfService', 'usersService', 'localStorageService', 'wizardData', 'toastService', '$log', '$i18next',
+ function ($rootScope, $scope, $uibModalInstance, vfService, usersService, localStorageService, wizardData, toastService, $log, $i18next) {
+
+ var wizard = this;
+ wizard.steps = [];
+ wizard.data = {};
+ wizard.user = wizardData.user;
+ wizard.is_service_provider_internal = wizardData.is_service_provider_internal;
+ wizard.eng_uuid = wizardData.eng_uuid;
+ wizard.requiredStep = wizardData.requiredStep;
+
+ var serviceProviderName = $i18next.t('serviceProvider.name');
+
+ var availableSteps = {
+ addVF: {name: 'addVF', title: 'Add a VF'},
+ addSponsor: {
+ name: 'addContact',
+ title: 'Add ' + serviceProviderName +' Sponsor',
+ mode: 'sponsor',
+ submitButton: 'Add ' + serviceProviderName + ' Sponsor'
+ },
+ addVendor: {
+ name: 'addContact',
+ title: 'Add Vendor Contact',
+ mode: 'vendor',
+ submitButton: 'Add Vendor Cotact',
+ },
+ inviteMembers: {name: 'inviteMembers', title: 'Invite Team Members'},
+ addSSH: {name: 'addSSH', title: 'Add SSH Key'}
+ };
+
+ wizard.setStep = function (step) {
+ wizard.currentStep = step
+ wizard.title = step.title;
+ step.completed = true;
+ };
+
+ function initWizard() {
+
+ $rootScope.ice.loader.show = true;
+
+ if (wizardData.showActivationMessage) {
+ toastService.setToast('You have successfully activated your account!', 'success', {displayFor: 'modal'});
+ }
+
+ wizard.stepIndex = 0;
+
+ if (wizard.requiredStep) {
+ wizard.steps.push(availableSteps[wizard.requiredStep]);
+ wizard.setStep(wizard.steps[wizard.stepIndex]);
+ $rootScope.ice.loader.show = false;
+ return;
+ }
+
+ if (!wizard.eng_uuid || wizard.eng_uuid === "") {
+ wizard.steps.push(availableSteps.addVF);
+ }
+ if (wizard.user.is_service_provider_contact === true && !wizard.is_service_provider_internal) {
+ wizard.steps.push(availableSteps.addVendor);
+ } else if (!wizard.user.is_service_provider_contact) {
+ wizard.steps.push(availableSteps.addSponsor);
+ }
+
+ getCompanies();
+
+ wizard.steps.push(availableSteps.inviteMembers);
+
+ var userData = usersService.getUserData() || {};
+ var ssh_public_key = userData.ssh_public_key;
+ if ((wizard.user.ssh_public_key === "" || wizard.user.ssh_public_key === null) &&
+ (ssh_public_key === "" || ssh_public_key === null)) {
+ wizard.steps.push(availableSteps.addSSH);
+ }
+
+ $rootScope.ice.loader.show = false;
+ wizard.setStep(wizard.steps[wizard.stepIndex]);
+ }
+
+ initWizard();
+
+ wizard.getCurrentStep = function () {
+ return wizard.currentStep.name;
+ };
+
+ wizard.nextStep = function () {
+ wizard.clearMessage();
+ wizard.stepIndex++;
+
+ if (wizard.stepIndex === (wizard.steps.length)) {
+ wizard.closeWizard();
+ return;
+ }
+
+ wizard.setStep(wizard.steps[wizard.stepIndex]);
+ };
+
+ wizard.closeWizard = function () {
+ wizard.clearMessage();
+ $uibModalInstance.close();
+
+ };
+
+ wizard.clearMessage = function () {
+ toastService.clearToast();
+ };
+
+ wizard.onAddContactSubmit = function () {
+ $rootScope.ice.loader.show = true;
+ wizard.data.addContact.eng_uuid = wizard.eng_uuid;
+
+ if (wizard.user.is_main_vendor_contact === true && !wizard.is_service_provider_internal) {
+ wizard.data.addContact.company = wizard.data.addContact.company;
+ } else if (!wizard.user.is_main_vendor_contact) {
+ wizard.data.addContact.company = wizard.data.attCompanyUuid;
+ }
+
+ usersService.addVendorContact(wizard.data.addContact)
+ .then(function (response) {
+ if (response.status === 200) {
+ $rootScope.ice.loader.show = false;
+ wizard.nextStep();
+ }
+ }, function (error) {
+ toastService.setToast(error.message, 'danger', {displayFor: 'modal'});
+ $log.error(error.message);
+ $rootScope.ice.loader.show = false;
+ })
+ .catch(function (error) {
+ wizard.Msg = error.status + " : " + error.statusText;
+ wizard.bgColor = "#FFEBEB"; // RED #FFEBEB green DFF0D9
+ $log.error(error);
+ $rootScope.ice.loader.show = false;
+ });
+ };
+
+ wizard.onInviteSubmit = function () {
+ $rootScope.ice.loader.show = true;
+ var is_service_provider_internal;
+ var jsonInviteMembers = [];
+ angular.forEach(wizard.inviteMembers.choices, function (value, key) {
+ wizard.item = [];
+ var jsonItem = new Object();
+ jsonItem.email = value.email;
+ jsonItem.eng_uuid = wizard.eng_uuid;
+ jsonInviteMembers.push(jsonItem);
+ });
+
+ vfService.inviteMembers(JSON.stringify(jsonInviteMembers))
+ .then(function (response) {
+ if (response.status === 200) {
+ wizard.nextStep();
+ }
+ $rootScope.ice.loader.show = false;
+ })
+ .catch(function (error) {
+ toastService.setToast(error.message.detail, 'danger', {displayFor: 'modal'});
+ $rootScope.ice.loader.show = false;
+ $log.error(error.message);
+ });
+ };
+
+ wizard.inviteMembers = {
+ choices: [
+ {
+ email: '',
+ eng_uuid: ''
+ }]
+ };
+
+ wizard.addNewChoice = function () {
+ var newItemNo = wizard.inviteMembers.choices.length + 1;
+ wizard.inviteMembers.choices.push({'id': newItemNo});
+ };
+
+ wizard.removeChoice = function () {
+ var lastItem = wizard.inviteMembers.choices.length - 1;
+ wizard.inviteMembers.choices.splice(lastItem);
+ };
+
+ wizard.onAddSSHSubmit = function () {
+ $rootScope.ice.loader.show = true;
+ usersService.setSSHKey(wizard.user.uuid, wizard.data.addSSH)
+ .then(function (response) {
+ if (response.status === 200) {
+ usersService.getIceUser()
+ .then(function (response) {
+ if (response.status === 200 && response.data && response.data !== '') {
+ wizard.user = response.data;
+ $rootScope.ice.loader.show = false;
+ $scope.$emit('onUpdateEngagements');
+ }
+ });
+ wizard.nextStep();
+ }
+
+ }).catch(function (error) {
+ toastService.setToast(error.message.detail, 'danger', {displayFor: 'modal'});
+ $rootScope.ice.loader.show = false;
+ $log.error(error.message.detail);
+ });
+ };
+
+ $scope.$on('moveWizardNextStep', function (event, args) {
+ wizard.is_service_provider_internal = args.is_service_provider_internal;
+ wizard.eng_uuid = args.engagement.uuid;
+ wizard.nextStep();
+ });
+
+ function getCompanies() {
+ vfService.getCompanies()
+ .then(function (response) {
+ if (response.status === 200) {
+ wizard.companies = response.data;
+ if(wizard.companies!=undefined){
+ for(var i=0; i<wizard.companies.length; i++){
+ if(wizard.companies[i].name=="AT&T"){
+ wizard.data.attCompanyUuid=wizard.companies[i].uuid;
+ break;
+ }
+ }
+ }
+ }
+ })
+ .catch(function (error) {
+ $log.error(error);
+ });
+ }
+ }]);
+})();
diff --git a/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.html b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.html
new file mode 100755
index 00000000..13ccaa3d
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.html
@@ -0,0 +1,38 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
diff --git a/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.less b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.less
new file mode 100755
index 00000000..81381198
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.less
@@ -0,0 +1,47 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+.getting-started-wizard {
+
+ ul.step-indication {
+ li {
+ display: inline;
+ }
+ }
+}
diff --git a/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.module.js b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.module.js
new file mode 100755
index 00000000..6e54399a
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/get-started-modal/get-started-modal.module.js
@@ -0,0 +1,48 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('ice.dashboard.get-started-modal', ['ngAnimate', 'ui.bootstrap', 'ice.activation.addVf']);
+
+
+})();
diff --git a/d2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard-container.html b/d2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard-container.html
new file mode 100755
index 00000000..97628a62
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard-container.html
@@ -0,0 +1,192 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<ice-toast is-modal="true"></ice-toast>
+<div class="getting-started-wizard">
+ <ice-loader selector=".modal-content"></ice-loader>
+
+ <div class="modal-header">
+ <h2 name="{{wizard.title}}" class="modal-title">{{wizard.title}}</h2>
+ <ul class="step-indication" ng-if="wizard.steps.length > 1">
+ <li ng-repeat="step in wizard.steps" ng-class="{selected: step.completed}">{{$index + 1}}</li>
+ </ul>
+
+ <button id="close-wizard-button" type="button" ng-click="wizard.closeWizard()" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span></button>
+ </div>
+ <div class="modal-body">
+
+ <div ng-switch="wizard.getCurrentStep()" class="slide-frame">
+ <div ng-switch-when="addVF">
+ <add-vf is-modal="true"></add-vf>
+ </div>
+
+ <div ng-switch-when="addContact">
+ <div>
+ Please take a couple of moments to provide some additional details around your virtual function to
+ get the process started. Do note that you can exit this wizard at any time to complete these items.
+ </div>
+
+ <form name="addContactForm" ng-submit="wizard.onAddContactSubmit()" novalidate
+ class="addVendorContact-form col-md-12">
+
+ <div class="form-group" ng-if="wizard.currentStep.mode === 'vendor'"
+ ng-class="{ 'has-error' : addContactForm.company.$invalid && !addContactForm.company.$pristine }">
+ <label class="ice-form-label required">Company</label>
+ <select style="width:100%" name="company" ng-model="wizard.data.addContact.company"
+ ng-options="company.uuid as company.name for company in wizard.companies track by company.uuid"
+ class="form-control" ng-required="wizard.currentStep.mode === 'vendor'"></select>
+ <div class="ice-form-error" data-ng-show="addContactForm.company.$error">
+ <span
+ ng-show="addContactForm.company.$error.required && !addContactForm.company.$pristine"
+ class="help-block">Please select a company</span>
+ </div>
+ </div>
+
+ <div class="form-group"
+ ng-class="{ 'has-error' : addContactForm.fullName.$invalid && !addContactForm.fullName.$pristine }">
+ <label class="ice-form-label required">Full Name</label>
+ <input type="text" name="fullname" class="form-control"
+ ng-model="wizard.data.addContact.full_name"
+ ng-minlength="3" ng-maxlength="50" maxlength="50" required>
+ <div class="ice-form-error" data-ng-show="addContactForm.fullname.$error">
+ <span
+ ng-show="addContactForm.fullname.$error.required && !addContactForm.fullname.$pristine">Full Name is a required field.</span>
+ <span ng-show="addContactForm.fullname.$error.minlength">Full Name is too short.</span>
+ <span ng-show="addContactForm.fullname.$error.maxlength">Full Name is too long.</span>
+ </div>
+ </div>
+
+ <div class="form-group"
+ ng-class="{ 'has-error' : addContactForm.email.$invalid && !addContactForm.email.$pristine }">
+ <label class="ice-form-label required">Email</label>
+ <input type="email" name="email" class="form-control" ng-model="wizard.data.addContact.email"
+ ng-pattern='/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/'
+ maxlength="254"
+ required>
+ <div class="ice-form-error" data-ng-show="addContactForm.email.$error">
+ <span
+ ng-show="addContactForm.email.$error.required && !addContactForm.email.$pristine">Email is a required field.</span>
+ <span ng-show="addContactForm.email.$invalid && !addContactForm.email.$pristine"
+ class="help-block">Enter a valid email.</span>
+ </div>
+ </div>
+
+ <div class="form-group"
+ ng-class="{ 'has-error' : addContactForm.phone.$invalid && !addContactForm.phone.$pristine }">
+ <label class="ice-form-label required">Phone</label>
+ <input type="text" name="phone" class="form-control" ng-intl-tel-input ng-model="wizard.data.addContact.phone_number" required ng-minlength="6" ng-maxlength="30">
+ <div class="ice-form-error" data-ng-show="addContactForm.phone.$error">
+ <span
+ ng-show="addContactForm.phone.$error.required && !addContactForm.phone.$pristine">Phone is a required field.</span>
+ <span ng-show="addContactForm.phone.$error.minlength"
+ class="help-block">Phone is too short.</span>
+ <span ng-show="addContactForm.phone.$error.maxlength"
+ class="help-block">Phone is too long.</span>
+ <span ng-show="addContactForm.phone.$error.pattern" class="help-block">Phone must consist of numbers only.</span>
+ <span ng-show="addContactForm.phone.$invalid" class="help-block">Phone format invalid</span>
+
+ </div>
+ </div>
+ <button class="btn btn-primary" type="submit" data-ng-disabled="!addContactForm.$valid">
+ {{wizard.currentStep.submitButton}}
+ </button>
+ </form>
+ </div>
+
+ <div ng-switch-when="inviteMembers">
+ <div>
+ You can invite up to 10 team members at a time to collaborate around your virtual function as you would like.
+ Please do remember that <em>anyone</em> who is invited to collaborate around the virtual function will have equal access.
+ </div>
+
+ <form name="inviteMembersForm" ng-submit="wizard.onInviteSubmit()" novalidate
+ class="inviteMembers-form col-md-12">
+ <div>
+ <fieldset data-ng-repeat="choice in wizard.inviteMembers.choices|limitTo:10">
+ <div id="containera" class="input-wrapper"><input type="email" name="email" class="form-control" ng-model="choice.email" maxlength="50" class="form-control" ng-pattern='/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/' required></div>
+ <div class="ice-form-error" data-ng-show="inviteMembersForm.email.$error">
+ <span
+ ng-show="inviteMembersForm.email.$error.required && !inviteMembersForm.email.$pristine">Email is a required field.</span>
+ <span ng-show="inviteMembersForm.email.$invalid && !inviteMembersForm.email.$pristine"
+ class="help-block">Enter a valid email.</span>
+ </div>
+ <div class="remove-button" ng-click='wizard.removeChoice()' ng-show="$last"><span class="remove-icon"></span>Remove</div>
+ </fieldset>
+ </div>
+ <a ng-if="wizard.inviteMembers.choices.length < 10" class="add-button" ng-click='wizard.addNewChoice()'>
+ <span class="add-icon"></span>
+ <span class="add-text">Invite another team member</span>
+ </a>
+
+ <button type="submit" class="btn btn-primary" data-ng-disabled="!inviteMembersForm.$valid">Send
+ invitations
+ </button>
+
+ </form>
+ </div>
+
+ <div ng-switch-when="addSSH">
+ <div>
+ It looks like you have not yet added your SSH key to your profile. You can add one
+ now. Please do remember that only team members who have added SSH keys to their
+ profile can add files.
+ </div>
+ <form name="addSSHForm" ng-submit="wizard.onAddSSHSubmit()" novalidate class="addSsh-form col-md-12">
+
+ <div class="form-group"
+ ng-class="{ 'has-error' : addSSHForm.key.$invalid && !addSSHForm.key.$pristine }">
+ <label class="ice-form-label required">SSH Key</label>
+ <textarea type="text" name="key" class="form-control" ng-model="wizard.data.addSSH.ssh_key"
+ ng-minlength="3" ng-maxlength="2048" required></textarea>
+ <div class="ice-form-error" data-ng-show="addSSHForm.key.$error">
+ <span
+ ng-show="addSSHForm.key.$error.required && !addSSHForm.key.$pristine"
+ class="help-block">Please enter your SSH key</span>
+ </div>
+ </div>
+
+ <button class="btn btn-primary" data-ng-disabled="!addSSHForm.$valid" type="submit">Add SSH Key</button>
+ </form>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+
+ </div>
+</div>
diff --git a/d2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard.less b/d2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard.less
new file mode 100755
index 00000000..4398d975
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/get-started-modal/wizard/wizard.less
@@ -0,0 +1,255 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+.dev-button {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+.reject_large {
+ .actions-sprite;
+ .actions-sprite.reject_large;
+ cursor: pointer;
+}
+
+.modal-content {
+ .getting-started-wizard {
+ .modal-header {
+ display: flex;
+ flex-direction: row;
+
+ h2, h3 {
+ display: inline-block;
+ flex-grow: 10;
+ }
+ }
+
+ .modal-body {
+ .btn {
+ width: 100%;
+ }
+
+ .btn-primary {
+ border: 1px solid #8799A3;
+ border-radius: 6px;
+ background: #1E79B0; /* For browsers that do not support gradients */
+ background: -webkit-linear-gradient(#1E79B0, #62ADD5); /* For Safari 5.1 to 6.0 */
+ background: -o-linear-gradient(#1E79B0, #62ADD5); /* For Opera 11.1 to 12.0 */
+ background: -moz-linear-gradient(#1E79B0, #62ADD5); /* For Firefox 3.6 to 15 */
+ background: linear-gradient(#1E79B0, #62ADD5); /* Standard syntax (must be last) */
+ }
+ }
+ }
+}
+
+.getting-started-wizard {
+
+
+
+
+
+ md-datepicker.btn.datepicker_btn {
+ .md-datepicker-input {
+ width: 100%;
+ text-align: center;
+ line-height: 32px;
+ }
+ }
+ #vf-name-title {
+ font-size: 16px;
+ }
+ #title-key-metadata{
+ font-size: 16px;
+ position: relative;
+ top: 20px;
+ left: 30px;
+ background: white;
+ padding: 0 20px;
+ margin-top: -15px;
+ }
+ .fields_key_metadata{
+ border:1px solid #ccc;
+ padding: 26px 10px;
+
+ }
+ /* Override addVf pages styles */
+ .container {
+ width: auto;
+
+ .col-md-2 { width: 0; }
+ .col-md-8 { width: 100%; }
+
+ .table-container-flex .flex-item {
+ padding: 5px 5px;
+ }
+
+ .remove-button {
+ display: none;
+ }
+ }
+
+ .table-container-flex {
+
+ .flex-item:nth-child(1) {
+ padding-left: 0;
+ flex-grow: 33;
+ }
+
+ .flex-item:nth-child(2) {
+ flex-grow: 33;
+ }
+
+ .flex-item:nth-child(3) {
+ flex-grow: 33;
+ }
+
+ }
+
+ ul.step-indication {
+ list-style: none;
+ display: inline-block;
+
+ li {
+ display: inline-block;
+ background-color: #DDDDDD;
+ width: 30px;
+ height: 30px;
+ margin-right: 10px;
+ padding: 6px 11px;
+ .m_14_m;
+
+ &.selected {
+ .p_14_m;
+ background-color: #1370A3;
+ }
+
+ &:last-child {
+ margin-right: 0;
+ }
+ }
+ }
+
+ .addVendorContact-form {
+ padding: 20px 0 0 0;
+
+ button {
+ margin-top: 10px;
+ }
+ }
+
+ .inviteMembers-form {
+ padding: 20px 0 0 0;
+
+ button {
+ margin-top: 10px;
+ }
+
+ .add-button {
+ margin-top: 8px;
+ display: block;
+ .add-text {
+ .a_16_m;
+ vertical-align: top;
+ margin-left: 6px;
+ }
+ .add-icon {
+ .sprite;
+ .sprite.add;
+ display: inline-block;
+ }
+ }
+
+ .remove-button {
+ vertical-align:middle;
+ .a_16_m;
+ cursor: pointer;
+
+ .remove-icon {
+ display: inline-block;
+ vertical-align: text-top;
+ margin-right: 6px;
+ .sprite;
+ .sprite.delete-circle;
+ cursor: pointer;
+ }
+ }
+
+
+ .remove-button {
+ vertical-align:middle;
+ .a_16_m;
+ cursor: pointer;
+
+ .reject-large {
+ display: inline-block;
+ vertical-align: text-top;
+ margin-right: 6px;
+ .sprite;
+ .sprite.delete-circle;
+ cursor: pointer;
+ }
+ }
+
+ .input-wrapper {
+ margin-bottom: 10px;
+ }
+
+ }
+
+ .addVf-form {
+ padding: 0;
+ }
+
+ .addSsh-form {
+ padding: 0;
+
+ .form-group {
+ margin-top: 20px;
+ }
+
+ button {
+ margin-top: 10px;
+ }
+
+ textarea {
+ min-height: 80px;
+ }
+ }
+
+}
diff --git a/d2ice.att.io/app/main/dashboard/main.module.js b/d2ice.att.io/app/main/dashboard/main.module.js
new file mode 100755
index 00000000..01a34a84
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/main.module.js
@@ -0,0 +1,107 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('ice.dashboard.main', ['ice.dashboard.get-started-modal'])
+ .config(config);
+
+ function config($stateProvider) {
+
+ $stateProvider
+ .state('app.dashboard', {
+ abstract: true,
+ views: {
+ 'navigation@app': {
+ templateUrl: 'core/navigation/layouts/horizontal-navigation/navigation.html',
+ controller: 'NavigationController as vm'
+ }
+ },
+ bodyClass: 'dashboard'
+ }).
+ state('app.dashboard.dashboard', {
+ url: '/dashboard/dashboard',
+ views: {
+ 'content@app': {
+ templateUrl: 'main/dashboard/dashboard/dashboard.html',
+ controller: 'DashboardMainController as vm'
+ },
+ },
+ params: {engagement_uuid: null,engagement:null,messagePass: null},
+ bodyClass: 'dashboard'
+ }).
+ state('app.dashboard.overview', {
+ url: '/dashboard/overview',
+ views: {
+ 'content@app': {
+ templateUrl: 'main/dashboard/overview/overview.html',
+ controller: 'OverviewMainController as vm'
+ },
+ },
+ params: {engagement_uuid: null,engagement:null,messagePass: null},
+ bodyClass: 'dashboard'
+ }).
+ state('app.dashboard.detailedview', {
+ url: '/dashboard/detailedview',
+ views: {
+ 'content@app': {
+ templateUrl: 'main/dashboard/detailed-view/detailed-view.html',
+ controller: 'detailedViewController as vm'
+ },
+ },
+ params: {engagement_uuid: null,engagement:null},
+ bodyClass: 'dashboard'
+ }).
+ state('app.dashboard.checklist', {
+ url: '/dashboard/checklist',
+ views: {
+ 'content@app': {
+ templateUrl: 'main/dashboard/checklist/checklist.html',
+ controller: 'DashboardChecklistController as vm'
+ },
+ },
+ params: {engagement_uuid: null,sub_id:null,engagement:null},
+ bodyClass: 'dashboard'
+ });
+
+ }
+
+})();
diff --git a/d2ice.att.io/app/main/dashboard/main/main.html b/d2ice.att.io/app/main/dashboard/main/main.html
new file mode 100755
index 00000000..f768619e
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/main/main.html
@@ -0,0 +1,172 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<div class="row main-wrapper">
+<ice-loader selector=".steps"></ice-loader>
+<ice-loader selector=".activity-log"></ice-loader>
+<div class="row">
+ <div class="col-md-8">
+ <span id="star-engagement-action_{{vm.name}}" class="sprite starred" ng-class="vm.starred == true ? 'is_starred' : 'not_starred'" ng-click="vm.starEngagement()"></span>
+ <h1>{{vm.name}}</h1>
+ </div>
+ <span class="col-md-8 git-repo-url" ng-if="vm.git_repo_url && vm.stage!=vm.stages.intake"><B>GIT:</B>&nbsp;{{vm.git_repo_url}}</span>
+</div>
+<step-stages-directive stage="vm.stage" eng-name="{{vm.vf_name}}" reviewer="{{vm.reviewer_uuid}}" stage-num="vm.stage_num" eng-uuid="{{vm.uuid}}"></step-stages-directive>
+<div data-ng-if="vm.stage!=vm.stages.intake">
+ <progress-directive progress="{{vm.progress}}"
+ vf="{{vm.vf}}"
+ callback="vm.updateProgress"
+ enable-edit="vm.isEngagementEL || vm.isAdmin"
+ completion-date="{{vm.completion_date}}"
+ engagement-uuid="{{vm.uuid}}"></progress-directive>
+</div>
+<div class="row main-section">
+ <div class="col-md-8 steps">
+ <div class="row steps-header">
+ <h2 class="col-md-6">Next Steps<span data-ng-if="vm.isEngagementEL || vm.isAdmin" id="add-next-step-button" class="add-step" data-ng-click="vm.addStep()"></span></h2>
+ <span class="col-md-6 filter-wrapper row">
+ <span >Files<multiselect id="selected-file-filter-dropdown" class="state-filter" ng-model="vm.chosen_files_filter" options="item for item in vm.files_filter_options" data-multiple="true" scroll-after-rows="5" filter-after-rows="5" ng-change="vm.is_all_files()" ms-header="Select files" tabindex="-1">
+ </multiselect></span>
+ <span >States<multiselect class="state-filter" ng-model="vm.selected_state_filter" options="item for item in vm.states_select" id="selected-state-filter-dropdown" data-multiple="true" scroll-after-rows="5" filter-after-rows="5" ng-change="vm.update_next_steps_choice()" ms-header="Select states" tabindex="-1">
+ </multiselect></span>
+ </span>
+ </div>
+ <ul class="step-indication">
+ <li class="step" data-ng-repeat="step in vm.steps | orderBy: 'due_date' as filtered_result track by step.uuid" ng-if="vm.is_match_both_filters(step)">
+ <div class="step-wrapper row" id="step-{{step.uuid}}" data-ng-class="{'completed': vm.states.completed==step.state && !vm.isEngagementEL, 'confirmed': vm.states.confirmed==step.state}">
+ <aside class="next-step-actions" data-ng-if="vm.isEngagementEL || vm.isAdmin">
+ <span class="moveto-confirmed"
+ data-ng-if="vm.states.confirmed != step.state && vm.states.completed==step.state"
+ title="Confirm"
+ data-ng-click="vm.updateStep(step.uuid,vm.states.confirmed)" id="confirmed_{{step.uuid}}"></span>
+ <span class="moveto-todo"
+ data-ng-if="vm.states.confirmed!=step.state && vm.states.todo!=step.state"
+ title="Deny"
+ data-ng-click="vm.updateStep(step.uuid,vm.states.todo)" id="todo_{{step.uuid}}"></span>
+ <span class="moveto-delete"
+ title="Delete"
+ data-ng-if="vm.states.confirmed != step.state"
+ data-ng-click="vm.deleteStep(step.uuid)" id="delete-{{step.uuid}}"></span>
+ </aside>
+ <div class="description col-xs-8 col-sm-8 col-md-8">
+ <div class="last-action-details">
+ <span class="name" id="{{step.last_updater.full_name}}_{{step.last_update_type}}">
+ {{step.last_updater && step.last_updater.full_name || step.creator.full_name}}
+ &nbsp;{{step.last_update_type}}:&nbsp;
+ </span>
+ <span class="time">{{(step.last_update_time) | date2: 'EEEE MMMM doo yyyy'}} at {{(step.last_update_time) | date: 'hh:mm' : timeGapLocal }} {{ampm}} {{mom}}</span>
+ </div>
+ <div id={{step.uuid}} class="step-state {{step.state | lowercase}}" data-ng-click="(step.state==vm.states.todo || step.state==vm.states.completed) && vm.toggleCompleted(step.uuid)"></div>
+ <div class="step-text" ng-bind-html="step.description | htmlspecialchars"></div>
+ </div>
+ <div class="details col-xs-4 col-sm-4 col-md-4">
+ <span class="next-step-due-date" ng-if="step['due_date'].length >0"><span class="icon"></span>{{(step['due_date']) | date2: 'EEEE MMMM doo yyyy'}}</span>
+ <span ng-if="step.engagement != null" class="edit-next-step glyphicon glyphicon-pencil" ng-click="vm.editStep(step)"></span>
+
+ <ul class="next-step-team-mates">
+
+ <li data-ng-repeat="member in step['assignees'] track by member.uuid"
+ data-ng-class="{'me': member.uuid == vm.me.uuid}"
+ title="{{member.full_name}} ({{member.email}})">
+ </li>
+ </ul>
+ <span uib-popover-template="'myPopoverTemplate.html'"
+ popover-title="Associated Files"
+ popover-trigger="mouseenter"
+ popover-html='true'
+ popover-placement="left"
+ class="" ng-if="step.files.length > 0">Associated Files ({{step.files.length}})</span>
+ <script type="text/ng-template" id="myPopoverTemplate.html">
+ <ul>
+ <li ng-repeat="file in step['files'] track by $index">- {{file}}</li>
+ </ul>
+ </script>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div class="col-md-4 team-and-logs">
+
+ <div id="engagement-status">
+ <h2>Current Status<span ng-if="vm.isEngagementEL || vm.isAdmin" ng-click="vm.addStatus()" id="add-status"></span><span ng-if="(vm.isEngagementEL || vm.isAdmin) && vm.status" ng-click="vm.editStatus()" id="edit-status"></span></h2>
+ <span id="status-update-details" ng-if="vm.status">
+ Last updated {{(vm.status.update_time) | date2: 'EEEE MMMM doo yyyy'}} at {{(vm.status.update_time) | date: 'hh:mm' : timeGapLocal }} {{ampm}} {{mom}}
+ by {{vm.status.creator.full_name}}
+ </span>
+ <p id="status-description">{{vm.status.description == undefined && 'No status update has been provided yet.' || vm.status.description }}</p>
+ </div>
+
+ <div class="team">
+ <h2><span>Team Members</span><span id="team-members-plus-button-id" ng-click="vm.addPeople()" class="add-people" ng-if="vm.name.length > 0"></span></h2>
+ <ul class="team-avatars">
+ <li id="c-l-te-am-me-mb-er-s-po-po-ve-r"
+ data-ng-repeat="member in vm.team track by member.uuid"
+ data-ng-class="{'me': member.uuid == vm.me.uuid}"
+ uib-popover-template="'myClTeamMembersPopoverTemplate.html'"
+ popover-trigger='mouseenter'
+ popover-html='true'
+ popover-placement='bottom'
+ >
+ <script type="text/ng-template" id="myClTeamMembersPopoverTemplate.html">
+ <span class="row">
+ <span class="popover-title-name col-md-12">{{member.full_name}} -<span class="popover-title-company">{{member.company.name}}</span></span>
+ <span class="popover-role-title col-md-12"> {{member.role.name == 'el' ? 'Engagement Lead' : '' }} {{member.role.name == 'el' && vm.reviewer_uuid == member.uuid ? ' - ' : ''}} {{vm.reviewer_uuid == member.uuid ? 'Reviewer' : ''}}</span>
+ <span class="popover-details">
+ <span class="popover-details-topic col-md-4">Email:</span><span class="popover-details-detail col-md-8">{{member.email}}</span>
+ <span class="popover-details-topic col-md-4">Phone:</span><span class="popover-details-detail col-md-8">{{member.phone_number}}</span>
+ </span>
+ </span>
+ </script>
+ </li>
+ </ul>
+ </div>
+
+ <div class="activity-log">
+ <h2>Activity Log</h2>
+ <ul class="activity-log-details">
+ <li data-ng-repeat="activity in vm.activities track by activity.uuid">
+ <notifications activity="activity"></notifications>
+ </li>
+ </ul>
+ </div>
+
+ </div>
+
+</div>
+</div>
diff --git a/d2ice.att.io/app/main/dashboard/overview/overview.controller.js b/d2ice.att.io/app/main/dashboard/overview/overview.controller.js
new file mode 100755
index 00000000..19d9839f
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/overview/overview.controller.js
@@ -0,0 +1,833 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+(function () {
+//test
+ 'use strict';
+
+ angular
+ .module('ice.dashboard.overview',[])
+ .controller('OverviewMainController', ["$scope","$rootScope", "_","$stateParams", "statusService", "stepsService", "vfService", "usersService", "iceConstants", "$uibModal", "cmsService", "toastService", "$state", "$log", overviewMainController]);
+
+ function overviewMainController($scope,$rootScope,_, $stateParams, statusService, stepsService, vfService, usersService, iceConstants, $uibModal, cmsService, toastService, $state, $log) {
+ var vm = this;
+
+ vm.sortableOptions = {
+ handle: ' .order-nextstep',
+ axis: 'y',
+ update: function(e, ui) {
+ stepsService.order_next_steps(vm.engagement.uuid, vm.steps)
+ .then(function (response) {
+ if (response.status === 200) {
+ $log.debug('updated');
+ }
+ })
+ .catch(function (error) {
+ $log.error(error);
+ });
+ }
+ };
+
+ var init = function () {
+ cmsService.setAnnouncementToast();
+ $rootScope.timeGapLocal = moment().format("z");// timeGap();
+ $rootScope.ampm = moment().format('A');
+ $rootScope.mom =moment().tz( moment.tz.guess()).format('z');
+
+ vm.engagement = $stateParams.engagement;
+
+ if (vm.engagement != undefined)
+ {
+ vm.me = usersService.getUserData();
+ vfService.getSingleEngagement(vm.me.uuid,vm.engagement.uuid)
+ .then(function (response) {
+ $rootScope.ice.loader.show = false;
+
+ if (response.status === 200 && response.data && response.data !== '') {
+ vm.vf = response.data;
+ vm.is_service_provider_internal = vm.vf.is_service_provider_internal;
+ vm.name = vm.vf.name;
+ vm.manual_id = vm.vf.engagement.engagement_manual_id;
+ if(!vm.vf.git_repo_url || vm.vf.git_repo_url==-1){
+ vm.git_repo_url = false;
+ }
+ else {
+ vm.git_repo_url = vm.vf.git_repo_url;
+ }
+ vm.storage_bucket_url = vm.manual_id + '_' + vm.name.toLowerCase();
+ vm.team = vm.vf.engagement.engagement_team;
+ vm.me = usersService.getUserData();
+ vm.stages = iceConstants.stages;
+ vm.stage = vm.vf.engagement.engagement_stage;
+ vm.stage_num = 0;
+ vm.set_stage_num(vm.stage);
+ vm.in_overview_page = true;
+ vm.uuid = vm.engagement.uuid;
+ vm.progress = vm.vf.engagement.progress;
+ vm.completion_date = vm.vf.engagement.target_completion_date;
+ vm.starred = false;
+ vm.isEngagmentLead = usersService.isUserInRole('el');
+ vm.isEngagementEL = usersService.isEngagementEL(vm.team);
+ vm.isAdmin = usersService.isAdmin(vm.me);
+ vm.does_user_role_allow_action_array = [vm.isAdmin, vm.isEngagementEL];
+ vm.unremoveable_users_from_eng_team_array = [vm.vf.engagement.reviewer.uuid, vm.vf.engagement.peer_reviewer.uuid,
+ vm.vf.engagement.creator.uuid]
+ if (vm.vf.engagement.contact_user != null) {
+ vm.unremoveable_users_from_eng_team_array.push(vm.vf.engagement.contact_user.uuid);
+ }
+ vm.states = iceConstants.states;
+ vm.states_select = serializeStates(iceConstants.states);
+ vm.selected_state_filter = getSelectedStatesByUserType();
+ vm.steps = [];
+ vm.vf_name = vm.vf.name;
+ vm.vf.engagement.starred_engagement.forEach(function(user) {
+ if (vm.me.uuid == user.uuid)
+ vm.starred = true;
+ });
+ vm.all_states = false;
+ vm.all_files = true;
+ initSteps();
+ vm.initActivityLogs();
+ vm.files = vm.vf.files;
+ vm.files_filter_options = [];
+ vm.files_filter_options = vm.files_filter_options.concat(vm.files);
+ vm.files_filter_options.push("Any file");
+ vm.chosen_files_filter = ["Any file"];
+ vm.show_step = true;
+ vm.status = false;
+ statusService.get(vm.uuid)
+ .then(function (response) {
+ if (response.status === 200)
+ {
+ vm.status = response.data;
+ } else
+ {
+ $log.error(response);
+ }
+ })
+ .catch(function (error) {
+ vm.status = false;
+ $log.error(error.message);
+ });
+ vm.progress_needed_data = getEngagementProgressData();
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+
+ }
+ };
+
+ vm.set_stage_num = function(state) {
+ switch (state) {
+ case 'Intake':
+ vm.stage_num = 1;
+ break;
+ case 'Active':
+ vm.stage_num = 2;
+ break;
+ case 'Validated':
+ vm.stage_num = 3;
+ break;
+ case 'Completed':
+ vm.stage_num = 4;
+ break;
+ };
+ };
+
+ vm.checkIfAdmin = function(user){
+ return usersService.isAdmin(user);
+ };
+
+
+ vm.is_user_allowed = function(){
+ if(_.includes(vm.does_user_role_allow_action_array, true) == true){
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+
+ vm.is_able_to_delete = function(requested_user){
+ if(vm.is_user_allowed() && !_.includes(vm.unremoveable_users_from_eng_team_array, requested_user.uuid)
+ && !vm.checkIfAdmin(requested_user)) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ };
+
+
+ vm.remove_user_from_eng = function(requested_user){
+ if(vm.is_able_to_delete(requested_user)) {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/general-prompt-modal/general-prompt-modal.html',
+ controller: 'generalPromptModalController',
+ controllerAs: 'vm',
+ resolve: {
+ modalDetails: function () {
+ return {
+ "upper_headline": 'Remove user from engagement team: ',
+ "upper_headline_value": requested_user.full_name,
+ "headline": 'Are you sure you would like to remove the user out of the team members?',
+ "is_message":false,
+ "message": '',
+ "approve": 'Yes',
+ "cancelText": 'No',
+ "is_close_modal_button":true
+ };
+ }
+ }
+ });
+ //in order to close the ui-popover before opening the confirmation modal.
+ angular.element('body').click();
+
+ modalInstance.result.then(function (approve_deletion) {
+ if(approve_deletion) {
+ var data = {'eng_uuid': vm.vf.engagement.uuid, 'user_uuid': requested_user.uuid}
+ vfService.remove_user_from_eng(data).then(function (response) {
+ $rootScope.ice.loader.show = false;
+ if (response.status === 204) {
+ $rootScope.$broadcast('onUpdateEngagements',{select : {uuid:vm.engagement.uuid,page_type:'overview',sub_id:undefined}});
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ }
+ });
+ }
+ else {
+ toastService.setToast('Action is not allowed.', 'danger');
+ $rootScope.ice.loader.show = false;
+ return;
+ }
+ };
+
+
+ $scope.is_match_both_filters = function () {
+ return function (step) {
+
+ var result = false;
+
+ if(vm.all_files && vm.all_states) {
+ result = true;
+ }
+ else if (vm.all_states && vm.is_contain_files(step)){
+ result = true;
+ }
+ else if (vm.all_files && vm.is_same_state(step.state)){
+ result = true;
+ }
+ else if (vm.is_contain_files(step) && vm.is_same_state(step.state)){
+ result = true;
+ }
+
+ if (result) {
+ return step;
+ }
+ return false;
+ }
+ }
+
+ vm.is_all_files = function() {
+ vm.all_files = vm.chosen_files_filter.indexOf("Any file") !== -1;
+ }
+
+ vm.is_contain_files = function(step) {
+ if (step.files) {
+ for (var i = 0; i < step.files.length; i++) {
+ if (vm.chosen_files_filter.indexOf(step.files[i]) !== -1) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ };
+
+ vm.is_same_state = function(step_state){
+ return vm.selected_state_filter.indexOf(step_state) !== -1;
+ };
+
+ vm.update_next_steps_choice = function(){
+ if(vm.selected_state_filter.indexOf("All") !== -1){
+ vm.all_states = true;
+ }
+ else {
+ vm.all_states = false;
+ }
+ };
+
+ vm.editStatus = function () {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/status/status.html',
+ controller: 'StatusModalController',
+ controllerAs: 'vm',
+ size: 'lg',
+ resolve: {
+
+ engagement_uuid: function () {
+ return vm.engagement.uuid;
+ },
+ action: function () {
+ return 'edit';
+ }
+ }
+ });
+
+ // Update the progress after modal closed.
+ modalInstance.result.then(function (data) {
+ if (data) {
+ vm.status = data;
+ }
+ }, function () {
+ $log.debug('Modal dismissed at: ' + new Date());
+ });
+ };
+
+ vm.addStatus = function () {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/status/status.html',
+ controller: 'StatusModalController',
+ controllerAs: 'vm',
+ size: 'lg',
+ resolve: {
+
+ engagement_uuid: function () {
+ return vm.engagement.uuid;
+ },
+ action: function () {
+ return 'add';
+ }
+ }
+ });
+
+ // Update the progress after modal closed.
+ modalInstance.result.then(function (data) {
+ if (data) {
+ vm.status = data;
+ }
+ }, function () {
+ $log.debug('Modal dismissed at: ' + new Date());
+ });
+ };
+
+ vm.deleteStep = function(step_uuid){
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/general-prompt-modal/general-prompt-modal.html',
+ controller: 'generalPromptModalController',
+ controllerAs: 'vm',
+ resolve: {
+ modalDetails: function () {
+ return {
+ "headline": 'Delete Step',
+ "is_message":true,
+ "message": 'Are you sure you want to delete this step?',
+ "approve": 'Delete Step',
+ "is_close_modal_button":true
+ };
+ }
+ }
+ });
+
+ modalInstance.result.then(function (deletionApproved) {
+ if(deletionApproved) {
+ stepsService.delete(step_uuid)
+ .then(function (response) {
+ if (response.status === 204) {
+ initSteps();
+ initActivityLogs();
+ }
+ })
+ .catch(function (error) {
+ $log.error(error);
+ });
+ }
+ });
+ };
+
+ // next steps modal
+ vm.editStep = function (nextstep) {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/next-steps/next-steps.html',
+ controller: 'NextStepsModalController',
+ controllerAs: 'vm',
+ size: 'lg',
+ resolve: {
+
+ engagement_team: function () {
+ return vm.team;
+ },
+ title: function () {
+ return vm.engagement.name;
+ },
+ associated_files: function () {
+ return vm.files;
+ },
+ engagement_uuid: function () {
+ return vm.engagement.uuid;
+ },
+ checklist: function () {
+ return undefined;
+ },
+ nextstep: function () {
+ return nextstep;
+ }
+ }
+ });
+
+ // Update the progress after modal closed.
+ modalInstance.result.then(function (data) {
+ if (data) {
+ initSteps();
+ }
+ }, function () {
+ $log.debug('Modal dismissed at: ' + new Date());
+ });
+ };
+
+ vm.addStep = function () {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/next-steps/next-steps.html',
+ controller: 'NextStepsModalController',
+ controllerAs: 'vm',
+ size: 'lg',
+ resolve: {
+ engagement_team: function () {
+ return vm.team;
+ },
+ title: function () {
+ return vm.engagement.name;
+ },
+ associated_files: function () {
+ return vm.files;
+ },
+ engagement_uuid: function () {
+ return vm.engagement.uuid;
+ },
+ checklist: function () {
+ return undefined;
+ },
+ nextstep: function () {
+ return undefined;
+ }
+ }
+ });
+
+ // Update the progress after modal closed.
+ modalInstance.result.then(function (data) {
+ if (data) {
+ data.forEach(function (step) {
+ step['creator'] = vm.me;
+ vm.steps.push(step);
+ });
+ initSteps();
+ }
+ }, function () {
+ $log.debug('Modal dismissed at: ' + new Date());
+ });
+ };
+
+ $rootScope.$on('onUpdateNextSteps', function (event, args) {
+ if(args.eng_uuid && args.stage){
+ vm.uuid = args.eng_uuid;
+ vm.stage = args.stage;
+ }
+ else{
+ $log.error("onUpdateNextStep expecting args");
+ return;
+ }
+ initSteps();
+ });
+
+ vm.starEngagement = function () {
+
+ vfService.putStarredEngagements(vm.engagement.uuid)
+ .then(function (response) {
+ $rootScope.ice.loader.show = false;
+ if (response.status === 200 && response.data && response.data !== '') {
+ if (vm.starred == true)
+ vm.starred = false
+ else
+ vm.starred = true
+ $rootScope.$broadcast('onUpdateEngagements',{select : {uuid:vm.engagement.uuid,page_type:'overview',sub_id:undefined}});
+
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ }
+
+ vm.updateStep = function (stepUuid, stepState) {
+ var data = {"state":stepState};
+ stepsService.update(stepUuid, data)
+ .then(function (response) {
+ if (response.status === 200) {
+ var step = getStepByUuid(stepUuid);
+ if (step){
+ initSteps();
+ vm.initActivityLogs();
+ }
+ }
+ })
+ .catch(function (error) {
+ $log.error(error);
+ });
+ };
+
+ vm.toggleCompleted = function (stepUuid) {
+ var step = getStepByUuid(stepUuid);
+ if (step){
+ if(step.state == vm.states.incomplete){
+ vm.updateStep(stepUuid, iceConstants.states.completed);
+ }else if(step.state == vm.states.completed){
+ vm.updateStep(stepUuid, iceConstants.states.incomplete);
+ }
+
+ }
+ };
+
+ vm.updateProgress = function(data) {
+ if (data && data.progress){
+ vm.progress = data.progress;
+ } else if (data && data.target_date){
+ vm.completion_date = data.target_date;
+ vm.target_completion_date = data.target_date;
+ }
+ };
+
+ vm.addPeople = function () {
+
+ var args = {
+ user: vm.me,
+ eng_uuid: vm.engagement.uuid,
+ is_service_provider_internal: vm.is_service_provider_internal,
+ requiredStep: 'inviteMembers'
+ };
+
+ $rootScope.$broadcast('openGettingStartedWizard', args);
+ };
+
+ var initSteps = function() {
+ $rootScope.ice.loader.show = true;
+ stepsService.get(vm.uuid, vm.stage)
+ .then(function (response) {
+ $rootScope.ice.loader.show = false;
+ if (response.status === 200) {
+ vm.steps = [];
+ response.data.forEach(function (step) {
+ vm.steps.push(step);
+ });
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ };
+
+ vm.initActivityLogs = function() {
+ $rootScope.ice.loader.show = true;
+ vfService.getActivities(vm.uuid)
+ .then(function (response) {
+ $rootScope.ice.loader.show = false;
+ if (response.status === 200) {
+ vm.activities = response.data;
+
+ }
+ })
+ .catch(function (error) {
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ };
+
+ var getStepByUuid = function(stepUuid) {
+ var foundStep;
+ if (vm.steps) {
+ vm.steps.forEach(function (step) {
+ if (step.uuid === stepUuid) {
+ foundStep = step;
+ }
+ });
+ }
+ return foundStep;
+ };
+
+ var serializeStates = function(states) {
+ var result = []
+ for(var key in states) {
+ result.push(states[key])
+ }
+
+ return result;
+ };
+
+ var getSelectedStatesByUserType = function() {
+ var result = [];
+
+// if(vm.isEngagementEL || vm.isAdmin) {
+// result.push("All","Completed","Incomplete");
+// } else { //For normal users:
+ result.push("Incomplete")
+// }
+
+ return result;
+ };
+
+ var getEngagementProgressData = function() {
+ var result = {
+ "enable_edit": ((vm.isEngagementEL || vm.isAdmin) && vm.in_overview_page),
+ "completion_date":vm.vf.engagement.target_completion_date,
+ "ecomp_release": vm.vf.ecomp_release.name,
+ "vnf_version": vm.vf.version,
+ "aic_version":vm.vf.deployment_target.version,
+ "aic_instantiation_time":vm.vf.engagement.aic_instantiation_time,
+ "asdc_onboarding_time":vm.vf.engagement.asdc_onboarding_time,
+ "heat_validated_time":vm.vf.engagement.heat_validated_time,
+ "image_scan_time":vm.vf.engagement.image_scan_time,
+ "engagement_uuid": vm.uuid, manual_id: vm.manual_id
+ };
+
+ return result;
+ };
+
+ vm.archiveEngagement = function() {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/archive-engagement-modal/archive-engagement-modal.html',
+ controller: 'archiveEngagementModalController',
+ controllerAs: 'vm',
+ resolve: {
+ engagementDetails: function () {
+ return {
+ "manual_id": vm.manual_id,
+ "name": vm.name,
+ "engagement": vm.engagement
+ };
+ }
+ }
+ });
+
+ modalInstance.result.then(function (archiveReason) {
+ if(archiveReason && vm.engagement && vm.engagement.uuid) {
+ vfService.archiveEngagement(vm.engagement.uuid, archiveReason)
+ .then(function() {
+ $state.go('app.dashboard.dashboard');
+ toastService.setToast("Engagement '" + vm.engagement.name + "' archived successfully.", 'success');
+ })
+ .catch (function(error) {
+ toastService.setToast("Server failed archiving engagement.", 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ } else {
+ toastService.setToast("No reason was supplied, therefor engagement cannot be archived.", 'danger');
+ }
+ });
+ };
+
+ vm.changeReviewer = function() {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/select-el-modal/select-el-modal.html',
+ controller: 'selectELModalController',
+ controllerAs: 'vm',
+ resolve: {
+ // We are not allow the reviewer and peer reviewer to be the same:
+ excludeUuids: function () {
+ return [vm.engagement.peer_reviewer_uuid];
+ },
+ selectedOption: function() {
+ return vm.engagement.reviewer_uuid;
+ }
+ }
+ });
+
+ modalInstance.result.then(function (userUuid) {
+ if(vm.engagement && vm.engagement.uuid) {
+
+ if (userUuid == vm.engagement.peer_reviewer_uuid) {
+ vfService.switchEngagementReviewers(vm.engagement.uuid, userUuid, vm.engagement.reviewer_uuid)
+ .then(function (response) {
+ vm.engagement.reviewer_uuid = response.data.reviewer;
+ vm.engagement.peer_reviewer_uuid = response.data.peerreviewer;
+ toastService.setToast("Reviewer and peer reviewer updated successfully.", 'success');
+ })
+ .catch(function (error) {
+ toastService.setToast("Server failed to update engagement reviewers.", 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ } else {
+ vfService.updateEngagementReviewer(vm.engagement.uuid, userUuid)
+ .then(function(response){
+ _.remove(vm.team, function(user) {return user.uuid === vm.engagement.reviewer_uuid;});
+ vm.team.push(response.data);
+ vm.engagement.reviewer_uuid = response.data.uuid;
+ toastService.setToast("Reviewer updated successfully.", 'success');
+ })
+ .catch(function(error) {
+ toastService.setToast("Server failed to update engagement reviewer.", 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ }} else {
+ toastService.setToast("Problem occurred while updating reviewer - missing engagement uuid.", 'danger');
+ }
+ })
+ };
+
+ vm.changePeerReviewer = function() {
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/select-el-modal/select-el-modal.html',
+ controller: 'selectELModalController',
+ controllerAs: 'vm',
+ resolve: {
+ // We are not allow the reviewer and peer reviewer to be the same:
+ excludeUuids: function () {
+ return [vm.engagement.reviewer_uuid];
+ },
+ selectedOption: function() {
+ return vm.engagement.peer_reviewer_uuid;
+ }
+ }
+ });
+
+ modalInstance.result.then(function (userUuid) {
+ if(vm.engagement && vm.engagement.uuid) {
+
+ if (userUuid == vm.engagement.reviewer_uuid) {
+ vfService.switchEngagementReviewers(vm.engagement.uuid, vm.engagement.peer_reviewer_uuid, userUuid)
+ .then(function (response) {
+ vm.engagement.reviewer_uuid = response.data.reviewer;
+ vm.engagement.peer_reviewer_uuid = response.data.peerreviewer;
+ toastService.setToast("Peer reviewer and reviewer updated successfully.", 'success');
+ })
+ .catch(function (error) {
+ toastService.setToast("Server failed to update engagement reviewers.", 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ } else {
+ vfService.updateEngagementPeerReviewer(vm.engagement.uuid, userUuid)
+ .then(function(response) {
+ $log.debug("vm.team", vm.team);
+ _.remove(vm.team, function(user) {return user.uuid === vm.engagement.peer_reviewer_uuid;});
+ vm.team.push(response.data);
+ vm.engagement.peer_reviewer_uuid = response.data.uuid;
+ toastService.setToast("Peer reviewer updated successfully.", 'success');
+ })
+ .catch(function(error) {
+ toastService.setToast("Server failed to update engagement peer reviewer.", 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ }} else {
+ toastService.setToast("Problem occurred while updating peer reviewer - missing engagement uuid.", 'danger');
+ }
+ })
+ };
+
+ vm.updateEngagementStatus = function() {
+ vm.vf.engagement.progress = parseInt(vm.progress);
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/update-engagement-status-modal/update-engagement-status-modal.html',
+ controller: 'updateEngagementStatusModalController',
+ controllerAs: 'vm',
+ resolve: {
+ engagement: function () {
+ // We will deliver a copy of the engagement so if the user hit 'Cancel' we won't change the original:
+ return angular.copy(vm.vf.engagement);
+ }
+ }
+ });
+
+ modalInstance.result.then(function (result) {
+ vfService.updateEngagement(result.engagement, result.status)
+ .then(function(response) {
+ vm.vf.engagement = result.engagement;
+ vm.progress = vm.vf.engagement.progress;
+ vm.progress_needed_data = getEngagementProgressData();
+ vm.status = response.data;
+ toastService.setToast("Engagement status updated successfully.", 'success');
+ })
+ .catch(function(error){
+ toastService.setToast("Server failed to update engagement status.", 'danger');
+ $rootScope.ice.loader.show = false;
+ $log.error(error);
+ });
+ })
+ };
+
+ vm.changeTargetCompletion = function(){
+ var modalInstance = $uibModal.open({
+ templateUrl: 'main/modals/change-date/change-date.html',
+ controller: 'ChangeDateModalController',
+ controllerAs: 'vm',
+ resolve: {
+ completionDate: function () {
+ return vm.vf.engagement.target_completion_date;
+ },
+ engagementUuid: function () {
+ return vm.engagement.uuid;
+ }
+ }
+ });
+
+ modalInstance.result.then(function (data) {
+ if (!data){
+ return;
+ }
+ vm.completion_date = data.target_date || vm.vf.engagement.target_completion_date;
+ vm.vf.engagement.target_completion_date = vm.completion_date;
+ }, function () {
+ $log.debug('Modal dismissed at: ' + new Date());
+ });
+ };
+
+ init();
+ }
+})();
diff --git a/d2ice.att.io/app/main/dashboard/overview/overview.html b/d2ice.att.io/app/main/dashboard/overview/overview.html
new file mode 100755
index 00000000..d1b3fc40
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/overview/overview.html
@@ -0,0 +1,212 @@
+<!--
+============LICENSE_START==========================================
+org.onap.vvp/portal
+===================================================================
+Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+===================================================================
+
+Unless otherwise specified, all software contained herein is licensed
+under the Apache License, Version 2.0 (the “License”);
+you may not use this software 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.
+
+
+
+Unless otherwise specified, all documentation contained herein is licensed
+under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+you may not use this documentation except in compliance with the License.
+You may obtain a copy of the License at
+
+ https:creativecommons.org/licenses/by/4.0/
+
+Unless required by applicable law or agreed to in writing, documentation
+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.
+
+============LICENSE_END============================================
+
+ECOMP is a trademark and service mark of AT&T Intellectual Property.-->
+<div class="no-display-text" ng-if="vm.engagement == undefined"></div>
+
+<div ng-class="vm.engagement == undefined ? 'no-display' : 'overview main-wrapper'">
+ <ice-loader selector=".steps"></ice-loader>
+ <ice-loader selector=".activity-log"></ice-loader>
+ <div class="row">
+ <div class="col-md-6">
+ <span id="star-engagement-action" class="sprite starred" ng-class="vm.starred == true ? 'is_starred' : 'not_starred'" ng-click="vm.starEngagement()"></span>
+ <h1 id="engagement-title">
+ <span class="manual-id" id="title-id-{{vm.manual_id}}: {{vm.name}}">{{vm.manual_id}}: </span>{{vm.name}}
+ </h1>
+ <span ng-show="vm.isEngagementEL || vm.isAdmin" uib-dropdown uib-dropdown-toggle on-toggle="toggled(open)" id="admin-actions-dropdown" class="admin-actions-dropdown sprite">
+ <ul class="dropdown-menu" uib-dropdown-menu role="menu">
+ <li role="menuitem" ng-show="vm.isAdmin"><a data-ng-click="vm.archiveEngagement()">Archive</a></li>
+ <li class="divider" ng-show="vm.isAdmin"></li>
+ <li role="menuitem" ng-show="vm.isAdmin"><a data-ng-click="vm.changeReviewer()">Change Reviewer</a></li>
+ <li class="divider" ng-show="vm.isAdmin"></li>
+ <li role="menuitem" ng-show="vm.isAdmin"><a data-ng-click="vm.changePeerReviewer()">Change Peer Reviewer</a></li>
+ <li class="divider" ng-show="vm.isAdmin" ></li>
+ <li role="menuitem" ng-show="vm.isEngagementEL || vm.isAdmin" ><a data-ng-click="vm.updateEngagementStatus()">Update Status</a></li>
+ </ul>
+ </span>
+ </div>
+ <div class="col-md-6 row">
+ <span class="col-md-12 git-repo-url" ng-if="vm.git_repo_url && vm.stage!=vm.stages.intake" id="git-url"><B>GIT:</B>&nbsp;{{vm.git_repo_url}}</span>
+ <span class="col-md-11 line-separator" ng-if="vm.git_repo_url && vm.stage!=vm.stages.intake"></span>
+ <span class="col-md-12 storage-bucket-url" ng-if="vm.stage!=vm.stages.intake" id="bucket-url"><B>STORAGE BUCKET:</B>&nbsp;{{vm.storage_bucket_url}}</span>
+ </div>
+ </div>
+ <step-stages-directive stage="vm.stage" eng-name="{{vm.vf_name}}" team="vm.team" stage-num="vm.stage_num" eng-uuid="{{vm.uuid}}"></step-stages-directive>
+ <div data-ng-if="vm.stage!=vm.stages.intake">
+ <progress-directive
+ progress="{{vm.progress}}"
+ callback="vm.updateProgress"
+ data="vm.progress_needed_data">
+ </progress-directive>
+ </div>
+
+ <div class="row main-section">
+ <div class="col-md-8 steps">
+ <div class="row steps-header">
+ <h2 class="col-md-6">Next Steps<span data-ng-if="vm.isEngagementEL || vm.isAdmin" id="add-next-step-button" class="add-step fa fa-plus-circle" data-ng-click="vm.addStep()"></span></h2>
+ <span class="col-md-6 filter-wrapper row">
+ <span >Files<multiselect id="selected-file-filter-dropdown" class="state-filter" ng-model="vm.chosen_files_filter" options="item for item in vm.files_filter_options" data-multiple="true" scroll-after-rows="5" filter-after-rows="5" ng-change="vm.is_all_files()" ms-header="Select files" tabindex="-1">
+ </multiselect></span>
+ <span >States<multiselect class="state-filter" ng-model="vm.selected_state_filter" options="item for item in vm.states_select" id="selected-state-filter-dropdown" data-multiple="true" scroll-after-rows="5" filter-after-rows="5" ng-change="vm.update_next_steps_choice()" ms-header="Select states" tabindex="-1">
+ </multiselect></span>
+ </span>
+ </div>
+ <ul class="step-indication" ui-sortable="vm.sortableOptions" ng-model="vm.steps" >
+ <li class="step" data-ng-repeat="step in sorted_results=( vm.steps | filter:is_match_both_filters()) track by step.uuid" >
+ <!-- ng-if="vm.is_match_both_filters(step)" -->
+ <div class="step-wrapper row" id="step-{{step.uuid}}" data-ng-class="{'completed': vm.states.completed==step.state && !vm.isEngagementEL, 'confirmed': vm.states.confirmed==step.state}">
+ <aside class="next-step-actions" data-ng-show="vm.isEngagementEL || vm.isAdmin">
+ <span class="order-nextstep fa fa-bars"></span>
+ <span ng-show="step.engagement" class="edit-next-step fa fa-pencil-square-o" ng-click="vm.editStep(step)"></span>
+ <span class="moveto-delete fa fa-minus-circle"
+ title="Delete"
+ data-ng-if="vm.states.confirmed != step.state"
+ data-ng-click="vm.deleteStep(step.uuid)" id="delete-{{step.uuid}}"></span>
+ </aside>
+ <div class="description col-xs-8 col-sm-8 col-md-8">
+ <div class="last-action-details">
+ <span class="name" id="{{step.last_updater.full_name}}_{{step.last_update_type}}">
+ <!--When the nex step is not related to engagement that's means it ssh key next step and we will display 'System Next Step' as tha last updater-->
+ {{step.engagement ? (step.last_updater && step.last_updater.full_name || step.creator.full_name) : "System Next Step"}}
+ &nbsp;{{step.last_update_type}}:&nbsp;
+ </span>
+ <span class="time">{{(step.last_update_time) | date2: 'EEEE MMMM doo yyyy'}} at {{(step.last_update_time) | date: 'hh:mm' : timeGapLocal }} {{ampm}} {{mom}}</span>
+ </div>
+ <div id={{step.uuid}} class="step-state {{step.state | lowercase}} fa" ng-class="{'fa-check-circle': step.state == 'Completed', 'fa-check-circle-o': step.state == 'Incomplete'}" data-ng-click="(step.state==vm.states.incomplete || step.state==vm.states.completed) && vm.toggleCompleted(step.uuid)"></div>
+ <div id="step-description-{{$index}}" class="step-text" ng-bind-html="step.description | htmlspecialchars"></div>
+ </div>
+ <div class="details col-xs-4 col-sm-4 col-md-4">
+ <span class="next-step-due-date" ng-if="step['due_date'].length >0"><span class="icon fa fa-clock-o"></span>{{(step['due_date']) | date2: 'EEEE MMMM doo yyyy'}}</span>
+ <ul class="next-step-team-mates">
+ <li data-ng-repeat="member in step['assignees'] track by member.uuid"
+ data-ng-class="{'me': member.uuid == vm.me.uuid}"
+ class="fa fa-user-circle-o"
+ title="{{member.full_name}} ({{member.email}})">
+ </li>
+ </ul>
+ <span uib-popover-template="'myPopoverTemplate.html'"
+ popover-title="Associated Files"
+ popover-trigger="outsideClick"
+ popover-html='true'
+ popover-placement="bottom"
+ class="associated-files"
+ id="associated-files">Associated Files <span class="fa fa-caret-square-o-down"></span></span>
+ <script type="text/ng-template" id="myPopoverTemplate.html">
+ <span id="associated-files-empty-msg" ng-if="!step.files || step.files.length === 0">There are no files for this next step</span>
+ <ul>
+ <li id="file{{$index}}" ng-repeat="file in step.files track by $index">- {{file}}</li>
+ </ul>
+ </script>
+ </div>
+ </div>
+ </li>
+ <h4 ng-show="!sorted_results || sorted_results.length === 0">No next steps matching filtered results.</h4>
+ </ul>
+ </div>
+ <div class="col-md-4 team-and-logs">
+ <div id="engagement-target-completion">
+ <div id="target-completion-header">
+ <span>Target Completion</span>
+ <i class="edit-target-completion fa fa-pencil-square-o" ng-show="vm.isEngagementEL || vm.isAdmin" data-ng-click="vm.changeTargetCompletion()" aria-hidden="true"></i>
+ </div>
+ <div id="target-completion-content">
+ <h4 class="target-completion-content">{{vm.completion_date | date:'shortDate'}}</h4>
+ </div>
+ </div>
+ <div id="engagement-status">
+ <div id="engagement-status-header">
+ <span>Current Status</span>
+ <i class="add-engagement-status fa fa-plus-circle" ng-show="vm.isEngagementEL || vm.isAdmin" ng-click="vm.addStatus()" aria-hidden="true"></i>
+ </div>
+ <div id="engagement-status-content">
+ <h4 class="engagement-status-content">
+ <i class="edit-engagement-status fa fa-pencil-square-o pull-right" ng-show="(vm.isEngagementEL || vm.isAdmin) && vm.status" ng-click="vm.editStatus()" aria-hidden="true"></i>
+ <span id="status-update-details" ng-if="vm.status">
+ Last updated {{(vm.status.update_time) | date2: 'EEEE MMMM doo yyyy'}} at {{(vm.status.update_time) | date: 'hh:mm' : timeGapLocal }} {{ampm}} {{mom}}
+ by {{vm.status.creator.full_name}}
+ </span>
+ <p id="status-description">{{vm.status.description == undefined && 'No status update has been provided yet.' || vm.status.description }}</p>
+ </h4>
+ </div>
+ </div>
+ <div id="engagement-team">
+ <div id="engagement-team-header">
+ <span>Team Members</span>
+ <i class="add-team-member fa fa-plus-circle" id="team-members-plus-button-id" ng-show="vm.name.length > 0" data-ng-click="vm.addPeople()" aria-hidden="true"></i>
+ </div>
+ <div class="engagement-team-content">
+ <ul class="team-avatars">
+ <li id="team-member-{{member.full_name}}"
+ data-ng-repeat="member in vm.team track by member.uuid"
+ data-ng-class="{'me': member.uuid == vm.me.uuid}"
+ uib-popover-template="'myClTeamMembersPopoverTemplate.html'"
+ popover-trigger='outsideClick'
+ popover-html='true'
+ class="team-member-avatar fa fa-user-circle-o"
+ popover-placement='bottom'>
+ <script type="text/ng-template" id="myClTeamMembersPopoverTemplate.html">
+ <span class="row">
+ <span id="team-member-title" class="popover-title-name col-md-12">
+ {{member.full_name}}
+ <span ng-show="member.company && member.company.name" class="popover-title-company"> - {{member.company.name}}</span>
+ <span class="popover-role-title ">{{vm.engagement.reviewer_uuid == member.uuid ? 'Reviewer' : ''}}{{vm.engagement.peer_reviewer_uuid == member.uuid ? 'Peer Reviewer' : ''}}</span>
+ </span>
+ <span class="popover-details">
+ <span class="popover-details-topic col-md-4">Email:</span><span id="team-member-email" class="popover-details-detail col-md-8">{{member.email}}</span>
+ <span ng-show="member.phone_number" class="popover-details-topic col-md-4">Phone:</span><span id="team-member-phone" class="popover-details-detail col-md-8">{{member.phone_number}}</span>
+ </span>
+ <span id="remove-member" ng-if="vm.is_able_to_delete(member)" class="remove-user-from-eng" ng-click="vm.remove_user_from_eng(member)">
+ <span>Remove</span><span class="remove-icon"></span>
+ </span>
+ </span>
+ </script>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <div class="activity-log">
+ <div id="activity-log-header">Activity Log</div>
+ <ul class="activity-log-details">
+ <li data-ng-repeat="activity in vm.activities track by activity.uuid">
+ <notifications id="activity-log-{{$index}}" activity="activity"></notifications>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/d2ice.att.io/app/main/dashboard/overview/overview.less b/d2ice.att.io/app/main/dashboard/overview/overview.less
new file mode 100755
index 00000000..48f76a47
--- /dev/null
+++ b/d2ice.att.io/app/main/dashboard/overview/overview.less
@@ -0,0 +1,575 @@
+//
+// ============LICENSE_START==========================================
+// org.onap.vvp/portal
+// ===================================================================
+// Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+// ===================================================================
+//
+// Unless otherwise specified, all software contained herein is licensed
+// under the Apache License, Version 2.0 (the “License”);
+// you may not use this software 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.
+//
+//
+//
+// Unless otherwise specified, all documentation contained herein is licensed
+// under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+// you may not use this documentation except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https:creativecommons.org/licenses/by/4.0/
+//
+// Unless required by applicable law or agreed to in writing, documentation
+// 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.
+//
+// ============LICENSE_END============================================
+//
+// ECOMP is a trademark and service mark of AT&T Intellectual Property.
+.dashboard {
+
+ .remove-user-from-eng {
+ .x_16_r;
+ float: right;
+ cursor: pointer;
+ .remove-icon {
+ .sprite;
+ .sprite.red-delete;
+ display: inline-block;
+ margin-left: 8px;
+ position: relative;
+ top: 3px;
+ }
+ }
+
+ .popover-title-name {
+ .a_18_m;
+ }
+
+ .popover-title-company {
+ .a_18_r;
+ }
+
+ .popover-role-title {
+ .n_16_i;
+ }
+
+ .popover-details {
+ .popover-details-topic {
+ .m_16_m;
+ }
+ .popover-details-detail {
+ word-wrap: break-word;
+
+ .m_16_r;
+ }
+ }
+
+ .content-container #content .main-wrapper {
+ height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
+ padding: 10px ;
+ }
+
+ .no-display-text{
+ .a_36_m;
+ }
+
+ .no-display{
+ display: none;
+ }
+
+ .overview {
+ #engagement-title {
+ color: @toolbar_background_color;
+ }
+ .manual-id {
+ .m_36_m;
+ color: @toolbar_background_color;
+ }
+
+ .filter-wrapper {
+ text-align: right;
+ padding:0px;
+ span {
+ padding: 0px;
+ margin-left: 5px;
+
+ }
+ .form-control-main-view{
+ margin-left: 5px;
+ display: inline;
+ padding: 6px;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+ }
+ }
+
+ .state-filter {
+ button {
+ padding: 0px 5px 0px 8px;
+ margin-bottom: 1px;
+ }
+
+ span {
+ right: 6px !important;
+ top: 9px !important;
+ }
+
+ a {
+ font-size: 14px;
+ }
+ }
+
+ .steps-progress-wrapper {
+ margin-top: 10px;
+ }
+
+ h1 {
+ display: inline-block;
+ .a_36;
+ margin: 0 0 30px 0;
+ }
+
+ h2 {
+ display: inline-block;
+ margin: 0 0 10px 0;
+ .a_24_m;
+ position: relative;
+ .add-people,
+ .add-step {
+ display: inline-block;
+ margin-left: 8px;
+ cursor: pointer;
+ position: relative;
+ top: 2px;
+ }
+ }
+
+ .main-section {
+ margin-top: 30px;
+ }
+
+ .steps-header {
+ background-color: @toolbar_background_color;
+ color: @main_color_p;
+ padding: 10px 0px 0px 0px;
+ margin: 0px 0px 0px -5px;
+
+ h2 {
+ font-size: 20px;
+ color: @main_color_p;
+ }
+
+ .steps-filter {
+ display: inline-block;
+ float: right;
+ .a_16_m;
+ .todo {
+ .sprite;
+ .sprite.todo;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .completed {
+ .sprite;
+ .sprite.pending;
+ display: inline-block;
+ cursor: pointer;
+ }
+ .confirmed {
+ .sprite;
+ .sprite.approved;
+ display: inline-block;
+ cursor: pointer;
+ }
+ }
+ }
+
+ #engagement-target-completion {
+ border: 1px solid @target_completion_color;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #target-completion-header {
+ background-color: @target_completion_color;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+
+ .edit-target-completion {
+ font-size: 21px;
+ vertical-align: middle;
+ padding-left: 6px;
+ cursor:pointer;
+ }
+ }
+
+ .target-completion-content {
+ .f-type._16_r;
+ margin: 15px;
+ }
+ }
+
+ #engagement-status {
+ border: 1px solid @engagement_status_color;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #engagement-status-header {
+ background-color: @engagement_status_color;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+
+ .add-engagement-status {
+ font-size: 21px;
+ vertical-align: middle;
+ padding-left: 6px;
+ cursor:pointer;
+ }
+ }
+
+ .engagement-status-content {
+ .f-type._16_r;
+ margin: 15px;
+
+ #status-update-details {
+ display:block;
+ .m_12_r;
+ }
+
+ #status-description {
+ margin: 3px 0px 0px 0px;
+ .m_16_r;
+ }
+
+ .edit-engagement-status {
+ font-size: 21px;
+ padding-left: 6px;
+ cursor:pointer;
+ color: @main_color_m;
+ }
+ }
+ }
+
+ #engagement-team {
+ border: 1px solid @engagement_team_color;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #engagement-team-header {
+ background-color: @engagement_team_color;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+
+ .add-team-member {
+ font-size: 21px;
+ vertical-align: middle;
+ padding-left: 6px;
+ cursor:pointer;
+ }
+ }
+
+ .engagement-team-content {
+ .f-type._16_r;
+ margin: 15px;
+
+ ul.team-avatars {
+ li.team-member-avatar {
+ font-size: 40px;
+ cursor:pointer;
+ color: @engagement_team_color;
+ }
+
+ li {
+ list-style: none;
+ display: inline-block;
+ margin-right: 10px;
+ }
+ }
+ }
+ }
+
+ #star-engagement-action {
+ display: inline-block;
+ cursor:pointer;
+ position: relative;
+ bottom: 3px;
+ margin-right: 5px;
+ }
+
+ #star-engagement-action.not_starred{
+ .sprite.starred;
+ }
+
+ #star-engagement-action.is_starred {
+ .sprite.starred-selected;
+ }
+
+ #star-engagement-action.not_starred:hover{
+ .sprite.starred-selected;
+ }
+
+ #star-engagement-action.is_starred:hover {
+ .sprite.starred;
+ }
+
+ .steps {
+ padding-bottom: 140px;
+ padding-right: 20px;
+ padding-left: 20px;
+
+ ul {
+ li.step {
+ border-bottom: dashed 1px @main_color_n;
+ .step-wrapper {
+ border-left: 2px solid transparent;
+ margin: 7px 0px 7px 1px;
+ &:hover {
+ border-left: 2px solid @main_color_a;
+ background-color: #DEF3FF;
+
+ .description {
+ .step-state {
+ &.incomplete {
+ color: @main_color_d;
+ opacity: 0.7;
+ }
+ }
+ }
+ }
+ }
+ .next-step-actions {
+ display:none;
+ height: 100%;
+ width: 20px;
+ position: relative;
+ padding-top: 10px;
+ float: left;
+ left: -18px;
+ margin-right: -20px;
+
+ > span {
+ margin-bottom: 3px;
+ cursor: pointer;
+ display:block;
+ }
+ .order-nextstep {
+ color: @main_color_o;
+ cursor:pointer;
+ }
+ .edit-next-step {
+ cursor:pointer;
+ color: @main_color_o;
+ }
+ .moveto-confirmed {
+ .actions-sprite;
+ .actions-sprite.approve_large;
+
+ }
+ .moveto-todo {
+ .actions-sprite;
+ .actions-sprite.reject_large;
+ }
+ .moveto-delete {
+ cursor:pointer;
+ color: @main_color_o;
+ }
+
+ }
+ &:hover {
+ .next-step-actions {
+ display:block;
+ }
+ .details {
+ .actions {
+ span {
+ visibility: visible;
+ }
+ }
+ }
+ }
+
+ div.completed {
+ opacity: 0.7;
+ }
+ div.confirmed {
+ opacity: 0.7;
+ }
+
+ .details {
+ text-align: right;
+ .next-step-due-date {
+ color: @main_color_m;
+ font-weight: bold;
+
+ .icon {
+ display: inline-block;
+ margin-right: 5px;
+ position: relative;
+ }
+ }
+
+ .associated-files {
+ color: @main_color_m;
+ font-weight: bold;
+ cursor: pointer;
+ }
+
+ ul.next-step-team-mates {
+ li {
+ list-style: none;
+ display: inline-block;
+ font-size: 27px;
+ padding-left: 5px;
+ color: @engagement_team_color;
+
+ &.me {
+ color: @main_color_a;
+ }
+ }
+
+ }
+
+ }
+ list-style: none;
+ position: relative;
+
+ .description {
+ .m_16_r;
+
+ padding:5px;
+
+ input {
+ position: absolute;
+ top: 10px;
+ left: 0;
+ margin-right: 20px;
+ }
+
+ .step-text {
+ margin-left: 35px;
+ }
+ .last-action-details {
+ .m_12_r;
+ .name {
+ font-weight: bold;
+ .m_12_m;
+
+ }
+ }
+ .step-state {
+ position: absolute;
+ top: 25px;
+ font-size: 25px;
+
+ &.incomplete {
+ color: @main_color_o;
+ display: inline-block;
+ }
+ &.completed {
+ color: @main_color_d;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .team-and-logs {
+ border-left: dashed 1px @main_color_a;
+ padding-left: 20px;
+ padding-right: 20px;
+
+ .activity-log {
+
+ border: 1px solid @engagement_team_color;
+ padding:0px;
+ margin-bottom: 20px;
+
+ #activity-log-header {
+ background-color: @engagement_team_color;
+ .p_18_m;
+ padding: 5px 5px 0;
+ line-height: 35px;
+ }
+ ul.activity-log-details {
+ margin:15px;
+ li {
+ list-style: none;
+ position: relative;
+ margin: 0 0 10px;
+
+ }
+ }
+ }
+
+ }
+
+ .admin-actions-dropdown {
+ .sprite.admin-dropdown;
+ color: @main_color_a;
+ font-size: 20px;
+ vertical-align: 4px;
+ margin-left: 5px;
+ cursor: pointer;
+ display: inline-block;
+ }
+ }
+
+ .add-next-step-form {
+ .ice-wysiwyg {
+ height: 200px;
+ .wysiwyg-menu > div {
+ background-color: #f1f1f1;
+ padding: 2px;
+ }
+ }
+ }
+
+ .git-repo-url{
+ text-align: left;
+ .m_16_m;
+ }
+
+ .storage-bucket-url{
+ text-align: left;
+ .m_16_m;
+ }
+
+ .line-separator {
+ border-bottom: solid thin;
+ margin-top: 5px;
+ margin-bottom: 7px;
+ align-items: left;
+ }
+}
+
+.intl-tel-input {
+ width: 100%;
+}
+
+.iti-flag {
+ background-image: url(images/flags.png);
+}