diff options
Diffstat (limited to 'd2ice.att.io/app/main/dashboard')
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">×</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> {{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}} + {{step.last_update_type}}: + </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> {{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> {{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"}} + {{step.last_update_type}}: + </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); +} |