From 627badaf69987c01811c477219fd943757a635f5 Mon Sep 17 00:00:00 2001 From: "Christopher Lott (Christopher) (cl778h)" Date: Mon, 12 Jun 2017 09:49:00 -0400 Subject: [PORTAL-16 PORTAL-18] Widget ms; staging Remove staging repositories from poms. Add widget microservice code base. Add portal unit tests. Repair defects. Normalize line endings. Change-Id: Ia5e48da2a3141b352439ecd548cddf918f4df585 Signed-off-by: Christopher Lott (cl778h) --- .../widget-details.controller.js | 452 ++++++++++----------- .../widget-details.controller.spec.js | 308 +++++++------- .../widget-details.modal.html | 304 +++++++------- .../client/app/views/widgets/widgets.controller.js | 336 +++++++-------- .../app/views/widgets/widgets.controller.spec.js | 38 +- .../client/app/views/widgets/widgets.tpl.html | 162 ++++---- 6 files changed, 800 insertions(+), 800 deletions(-) (limited to 'ecomp-portal-FE-common/client/app/views/widgets') diff --git a/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.js b/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.js index eb628b4f..a7c29043 100644 --- a/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.js +++ b/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.js @@ -1,226 +1,226 @@ -/*- - * ================================================================================ - * ECOMP Portal - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ================================================================================ - */ -/** - * Created by nnaffar on 12/20/15. - */ -'use strict'; -(function () { - class WidgetDetailsModalCtrl { - constructor($scope, $log, applicationsService, widgetsService, errorMessageByCode, - ECOMP_URL_REGEX, $window, userProfileService, $cookies, $rootScope) { - - let newWidgetModel = { - name: null, - appId: null, - appName: null, - width: 360, - height: 300, - url: null - }; - - let getAvailableApps = () => { - applicationsService.getAppsForSuperAdminAndAccountAdmin().then(apps => { - this.availableApps=[]; - for(var i=0;i { - confirmBoxService.showInformation('There was a problem retrieving the Widgets. ' + - 'Please try again later.').then(isConfirmed => {}); - $log.error('WidgetDetailsModalCtrl::getAvailableApps error: '+ err); - }); - }; - /**/ - - let init = () => { - this.isSaving = false; - if ($scope.ngDialogData && $scope.ngDialogData.widget) { - $log.debug('WidgetDetailsModalCtrl::getAvailableApps: Edit widget mode for', $scope.ngDialogData.widget); - this.isEditMode = true; - this.widget = _.clone($scope.ngDialogData.widget); - } else { - $log.debug('WidgetDetailsModalCtrl::init: New app mode'); - this.isEditMode = false; - this.widget = _.clone(newWidgetModel); - } - getAvailableApps(); - }; - - this.ECOMP_URL_REGEX = ECOMP_URL_REGEX; - - //This part handles conflict errors (409) - this.conflictMessages = {}; - this.scrollApi = {}; - let handleConflictErrors = err => { - if(!err.data){ - return; - } - if(!err.data.length){ //support objects - err.data = [err.data] - } - _.forEach(err.data, item => { - _.forEach(item.fields, field => { - //set conflict message - this.conflictMessages[field.name] = errorMessageByCode[item.errorCode]; - //set field as invalid - $scope.widgetForm[field.name].$setValidity('conflict', false); - //set watch once to clear error after user correction - watchOnce[field.name](); - }); - }); - this.scrollApi.scrollTop(); - }; - - let resetConflict = fieldName => { - delete this.conflictMessages[fieldName]; - if($scope.widgetForm[fieldName]){ - $scope.widgetForm[fieldName].$setValidity('conflict', true); - } - }; - - let watchOnce = { - name: () => { - let unregisterName = $scope.$watchGroup(['widgetDetails.selectedApp','widgetDetails.widget.name'], (newVal, oldVal) => { - if(newVal.toLowerCase() !== oldVal.toLowerCase()){ - resetConflict('name'); - unregisterName(); - } - }); - }, - url: () => { - let unregisterUrl = $scope.$watch('widgetDetails.widget.url', (newVal, oldVal) => { - if(newVal.toLowerCase() !== oldVal.toLowerCase()) { - resetConflict('url'); - unregisterUrl(); - } - }); - } - }; - //*************************** - - this.updateSelectedApp = () => { - if (!this.selectedApp) { - return; - } - this.widget.appId = this.selectedApp.id; - this.widget.appName = this.selectedApp.name; - }; - - let emptyCookies = () => { - userProfileService.getUserProfile() - .then(profile=> { - $scope.orgUserId = profile.orgUserId; - if ($cookies.getObject($scope.orgUserId + '_widget') != undefined && $cookies.getObject($scope.orgUserId + '_widget') != null) { - $cookies.remove($scope.orgUserId + '_widget'); - } - }).catch(err => { - $log.error('WidgetDetailsModalCtrl::emptyCookies: There was a problem emptying the cookies! No user error presented though.'); - }); - }; - - this.saveChanges = () => { - if($scope.widgetForm.$invalid){ - return; - } - this.isSaving = true; - if(this.isEditMode){ - widgetsService.updateWidget(this.widget.id, this.widget) - .then(() => { - $log.debug('WidgetDetailsModalCtrl::saveChanges: Widget update succeeded!'); - $scope.closeThisDialog(true); - emptyCookies(); - }).catch(err => { - if(err.status === 409){//Conflict - handleConflictErrors(err); - } else { - confirmBoxService.showInformation('There was a problem saving the Widget. ' + - 'Please try again later. Error Status: ' + err.status).then(isConfirmed => {}); - } - $log.error('WidgetDetailsModalCtrl::saveChanges error: ', err); - }).finally(()=>{ - this.isSaving = false; - // for bug in IE 11 - var objOffsetVersion = objAgent.indexOf("MSIE"); - if (objOffsetVersion != -1) { - $log.debug('WidgetDetailsModalCtrl::saveChanges: Browser is IE, forcing Refresh'); - $window.location.reload(); // for bug in IE 11 - } - // for bug in IE 11 - }); - } else { - widgetsService.createWidget(this.widget) - .then(() => { - $log.debug('WidgetDetailsModalCtrl::createWidget: Widget creation succeeded!'); - $scope.closeThisDialog(true); - emptyCookies(); - $rootScope.noWidgets = false; - }).catch(err => { - if(err.status === 409){//Conflict - handleConflictErrors(err); - } else { - confirmBoxService.showInformation('There was a problem creating the Widget. ' + - 'Please try again later. Error Status: ' + err.status).then(isConfirmed => {}); - } - $log.error('WidgetDetailsModalCtrl::createWidget error: ',err); - }).finally(()=>{ - this.isSaving = false; - // for bug in IE 11 - var objOffsetVersion = objAgent.indexOf("MSIE"); - if (objOffsetVersion != -1) { - $log.debug('WidgetDetailsModalCtrl::createWidget: Browser is IE, forcing Refresh'); - $window.location.reload(); // for bug in IE 11 - } - // for bug in IE 11 - }); - } - }; - - init(); - - $scope.$on('$stateChangeStart', e => { - //Disable navigation when modal is opened - e.preventDefault(); - }); - } - } - WidgetDetailsModalCtrl.$inject = ['$scope', '$log', 'applicationsService', 'widgetsService', 'errorMessageByCode', - 'ECOMP_URL_REGEX', '$window','userProfileService','$cookies', '$rootScope']; - angular.module('ecompApp').controller('WidgetDetailsModalCtrl', WidgetDetailsModalCtrl); -})(); +/*- + * ================================================================================ + * ECOMP Portal + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +/** + * Created by nnaffar on 12/20/15. + */ +'use strict'; +(function () { + class WidgetDetailsModalCtrl { + constructor($scope, $log, applicationsService, widgetsService, errorMessageByCode, + ECOMP_URL_REGEX, $window, userProfileService, $cookies, $rootScope) { + + let newWidgetModel = { + name: null, + appId: null, + appName: null, + width: 360, + height: 300, + url: null + }; + + let getAvailableApps = () => { + applicationsService.getAppsForSuperAdminAndAccountAdmin().then(apps => { + this.availableApps=[]; + for(var i=0;i { + confirmBoxService.showInformation('There was a problem retrieving the Widgets. ' + + 'Please try again later.').then(isConfirmed => {}); + $log.error('WidgetDetailsModalCtrl::getAvailableApps error: '+ err); + }); + }; + /**/ + + let init = () => { + this.isSaving = false; + if ($scope.ngDialogData && $scope.ngDialogData.widget) { + $log.debug('WidgetDetailsModalCtrl::getAvailableApps: Edit widget mode for', $scope.ngDialogData.widget); + this.isEditMode = true; + this.widget = _.clone($scope.ngDialogData.widget); + } else { + $log.debug('WidgetDetailsModalCtrl::init: New app mode'); + this.isEditMode = false; + this.widget = _.clone(newWidgetModel); + } + getAvailableApps(); + }; + + this.ECOMP_URL_REGEX = ECOMP_URL_REGEX; + + //This part handles conflict errors (409) + this.conflictMessages = {}; + this.scrollApi = {}; + let handleConflictErrors = err => { + if(!err.data){ + return; + } + if(!err.data.length){ //support objects + err.data = [err.data] + } + _.forEach(err.data, item => { + _.forEach(item.fields, field => { + //set conflict message + this.conflictMessages[field.name] = errorMessageByCode[item.errorCode]; + //set field as invalid + $scope.widgetForm[field.name].$setValidity('conflict', false); + //set watch once to clear error after user correction + watchOnce[field.name](); + }); + }); + this.scrollApi.scrollTop(); + }; + + let resetConflict = fieldName => { + delete this.conflictMessages[fieldName]; + if($scope.widgetForm[fieldName]){ + $scope.widgetForm[fieldName].$setValidity('conflict', true); + } + }; + + let watchOnce = { + name: () => { + let unregisterName = $scope.$watchGroup(['widgetDetails.selectedApp','widgetDetails.widget.name'], (newVal, oldVal) => { + if(newVal.toLowerCase() !== oldVal.toLowerCase()){ + resetConflict('name'); + unregisterName(); + } + }); + }, + url: () => { + let unregisterUrl = $scope.$watch('widgetDetails.widget.url', (newVal, oldVal) => { + if(newVal.toLowerCase() !== oldVal.toLowerCase()) { + resetConflict('url'); + unregisterUrl(); + } + }); + } + }; + //*************************** + + this.updateSelectedApp = () => { + if (!this.selectedApp) { + return; + } + this.widget.appId = this.selectedApp.id; + this.widget.appName = this.selectedApp.name; + }; + + let emptyCookies = () => { + userProfileService.getUserProfile() + .then(profile=> { + $scope.orgUserId = profile.orgUserId; + if ($cookies.getObject($scope.orgUserId + '_widget') != undefined && $cookies.getObject($scope.orgUserId + '_widget') != null) { + $cookies.remove($scope.orgUserId + '_widget'); + } + }).catch(err => { + $log.error('WidgetDetailsModalCtrl::emptyCookies: There was a problem emptying the cookies! No user error presented though.'); + }); + }; + + this.saveChanges = () => { + if($scope.widgetForm.$invalid){ + return; + } + this.isSaving = true; + if(this.isEditMode){ + widgetsService.updateWidget(this.widget.id, this.widget) + .then(() => { + $log.debug('WidgetDetailsModalCtrl::saveChanges: Widget update succeeded!'); + $scope.closeThisDialog(true); + emptyCookies(); + }).catch(err => { + if(err.status === 409){//Conflict + handleConflictErrors(err); + } else { + confirmBoxService.showInformation('There was a problem saving the Widget. ' + + 'Please try again later. Error Status: ' + err.status).then(isConfirmed => {}); + } + $log.error('WidgetDetailsModalCtrl::saveChanges error: ', err); + }).finally(()=>{ + this.isSaving = false; + // for bug in IE 11 + var objOffsetVersion = objAgent.indexOf("MSIE"); + if (objOffsetVersion != -1) { + $log.debug('WidgetDetailsModalCtrl::saveChanges: Browser is IE, forcing Refresh'); + $window.location.reload(); // for bug in IE 11 + } + // for bug in IE 11 + }); + } else { + widgetsService.createWidget(this.widget) + .then(() => { + $log.debug('WidgetDetailsModalCtrl::createWidget: Widget creation succeeded!'); + $scope.closeThisDialog(true); + emptyCookies(); + $rootScope.noWidgets = false; + }).catch(err => { + if(err.status === 409){//Conflict + handleConflictErrors(err); + } else { + confirmBoxService.showInformation('There was a problem creating the Widget. ' + + 'Please try again later. Error Status: ' + err.status).then(isConfirmed => {}); + } + $log.error('WidgetDetailsModalCtrl::createWidget error: ',err); + }).finally(()=>{ + this.isSaving = false; + // for bug in IE 11 + var objOffsetVersion = objAgent.indexOf("MSIE"); + if (objOffsetVersion != -1) { + $log.debug('WidgetDetailsModalCtrl::createWidget: Browser is IE, forcing Refresh'); + $window.location.reload(); // for bug in IE 11 + } + // for bug in IE 11 + }); + } + }; + + init(); + + $scope.$on('$stateChangeStart', e => { + //Disable navigation when modal is opened + e.preventDefault(); + }); + } + } + WidgetDetailsModalCtrl.$inject = ['$scope', '$log', 'applicationsService', 'widgetsService', 'errorMessageByCode', + 'ECOMP_URL_REGEX', '$window','userProfileService','$cookies', '$rootScope']; + angular.module('ecompApp').controller('WidgetDetailsModalCtrl', WidgetDetailsModalCtrl); +})(); diff --git a/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.spec.js b/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.spec.js index 1762fadb..927836ae 100644 --- a/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.spec.js +++ b/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.controller.spec.js @@ -1,154 +1,154 @@ -/*- - * ================================================================================ - * ECOMP Portal - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ================================================================================ - */ -// 'use strict'; -// describe('Controller: WidgetDetailsModalCtrl', ()=> { -// /** -// * INITIALIZATION -// */ -// beforeEach(module('testUtils')); -// beforeEach(module('ecompApp')); -// -// let promisesTestUtils; -// //destroy $http default cache before starting to prevent the error 'default cache already exists' -// //_promisesTestUtils_ comes from testUtils for promises resolve/reject -// beforeEach(inject((_CacheFactory_, _promisesTestUtils_)=> { -// _CacheFactory_.destroyAll(); -// promisesTestUtils = _promisesTestUtils_; -// })); -// -// let widgetDetails, scope, $controller, $q, $rootScope, $log, widgetsService, errorMessageByCode, ECOMP_URL_REGEX; -// let deferredAdminApps, deferredUserProfile; -// let applicationsServiceMock, widgetsServiceMock, userProfileServiceMock; -// beforeEach(inject((_$controller_, _$q_, _$rootScope_, _$log_)=> { -// [$controller, $q, $rootScope, $log] = [_$controller_, _$q_, _$rootScope_, _$log_]; -// -// deferredAdminApps = $q.defer(); -// deferredUserProfile = $q.defer(); -// /*applicationsServiceMock = { -// getAppsForSuperAdminAndAccountAdmin: () => { -// var promise = () => {return deferredAdminApps.promise}; -// var cancel = jasmine.createSpy(); -// return { -// promise: promise, -// cancel: cancel -// } -// } -// };*/ -// -// widgetsServiceMock = { -// updateWidget: () => { -// var promise = () => {return deferredAdminApps.promise}; -// var cancel = jasmine.createSpy(); -// return { -// promise: promise, -// cancel: cancel -// } -// }, -// createWidget: () => { -// var promise = () => {return deferredAdminApps.promise}; -// var cancel = jasmine.createSpy(); -// return { -// promise: promise, -// cancel: cancel -// } -// } -// }; -// -// userProfileServiceMock = jasmine.createSpyObj('userProfileServiceMock',['getUserProfile']); -// userProfileServiceMock.getUserProfile.and.returnValue(deferredUserProfile.promise); -// -// applicationsServiceMock = jasmine.createSpyObj('applicationsServiceMock',['getAppsForSuperAdminAndAccountAdmin']); -// applicationsServiceMock.getAppsForSuperAdminAndAccountAdmin.and.returnValue(deferredAdminApps.promise); -// -// })); -// -// beforeEach(()=> { -// errorMessageByCode = []; -// ECOMP_URL_REGEX = ""; -// scope = $rootScope.$new(); -// createController(scope); -// }); -// -// let createController = scopeObj => { -// widgetDetails = $controller('WidgetDetailsModalCtrl', { -// $scope: scope, -// $log: $log, -// applicationsService: applicationsServiceMock, -// widgetsService: widgetsServiceMock, -// errorMessageByCode: errorMessageByCode, -// ECOMP_URL_REGEX: ECOMP_URL_REGEX, -// userProfileService: userProfileServiceMock -// }); -// }; -// -// /** -// * MOCK DATA -// */ -// let newWidgetModel = { -// name: null, -// appId: null, -// appName: null, -// width: 360, -// height: 300, -// url: null -// }; -// let exsistingWidget = { -// name: 'some widget', -// appId: 1, -// appName: 'APP NAME', -// width: 360, -// height: 300, -// url: 'http://a.com' -// }; -// let adminApps = [{id: 1, name: 'a'}, {id: 2, name: 'b'}]; -// -// /** -// * TEST CASES -// */ -// it('should initialize controller with new widget mode when opening the modal without selected widget', ()=> { -// expect(widgetDetails.widget).toEqual(newWidgetModel); -// }); -// -// it('should initialize controller with exsisting widget details when opening the modal with selected widget', ()=> { -// scope.ngDialogData = { -// widget: exsistingWidget -// }; -// createController(scope); -// expect(widgetDetails.widget).toEqual(exsistingWidget); -// }); -// -// it('should populate widget selected app name and id when initializing controller with widget', () =>{ -// deferredAdminApps.resolve(adminApps); -// scope.ngDialogData = { -// widget: exsistingWidget -// }; -// createController(scope); -// scope.$apply(); -// expect(widgetDetails.widget.appId).toEqual(adminApps[0].id); -// expect(widgetDetails.widget.appName).toEqual(adminApps[0].name); -// }); -// -// //TODO: -// //save changes fail - conflict handling -// //save changes success -// -// -// -// }); +/*- + * ================================================================================ + * ECOMP Portal + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +// 'use strict'; +// describe('Controller: WidgetDetailsModalCtrl', ()=> { +// /** +// * INITIALIZATION +// */ +// beforeEach(module('testUtils')); +// beforeEach(module('ecompApp')); +// +// let promisesTestUtils; +// //destroy $http default cache before starting to prevent the error 'default cache already exists' +// //_promisesTestUtils_ comes from testUtils for promises resolve/reject +// beforeEach(inject((_CacheFactory_, _promisesTestUtils_)=> { +// _CacheFactory_.destroyAll(); +// promisesTestUtils = _promisesTestUtils_; +// })); +// +// let widgetDetails, scope, $controller, $q, $rootScope, $log, widgetsService, errorMessageByCode, ECOMP_URL_REGEX; +// let deferredAdminApps, deferredUserProfile; +// let applicationsServiceMock, widgetsServiceMock, userProfileServiceMock; +// beforeEach(inject((_$controller_, _$q_, _$rootScope_, _$log_)=> { +// [$controller, $q, $rootScope, $log] = [_$controller_, _$q_, _$rootScope_, _$log_]; +// +// deferredAdminApps = $q.defer(); +// deferredUserProfile = $q.defer(); +// /*applicationsServiceMock = { +// getAppsForSuperAdminAndAccountAdmin: () => { +// var promise = () => {return deferredAdminApps.promise}; +// var cancel = jasmine.createSpy(); +// return { +// promise: promise, +// cancel: cancel +// } +// } +// };*/ +// +// widgetsServiceMock = { +// updateWidget: () => { +// var promise = () => {return deferredAdminApps.promise}; +// var cancel = jasmine.createSpy(); +// return { +// promise: promise, +// cancel: cancel +// } +// }, +// createWidget: () => { +// var promise = () => {return deferredAdminApps.promise}; +// var cancel = jasmine.createSpy(); +// return { +// promise: promise, +// cancel: cancel +// } +// } +// }; +// +// userProfileServiceMock = jasmine.createSpyObj('userProfileServiceMock',['getUserProfile']); +// userProfileServiceMock.getUserProfile.and.returnValue(deferredUserProfile.promise); +// +// applicationsServiceMock = jasmine.createSpyObj('applicationsServiceMock',['getAppsForSuperAdminAndAccountAdmin']); +// applicationsServiceMock.getAppsForSuperAdminAndAccountAdmin.and.returnValue(deferredAdminApps.promise); +// +// })); +// +// beforeEach(()=> { +// errorMessageByCode = []; +// ECOMP_URL_REGEX = ""; +// scope = $rootScope.$new(); +// createController(scope); +// }); +// +// let createController = scopeObj => { +// widgetDetails = $controller('WidgetDetailsModalCtrl', { +// $scope: scope, +// $log: $log, +// applicationsService: applicationsServiceMock, +// widgetsService: widgetsServiceMock, +// errorMessageByCode: errorMessageByCode, +// ECOMP_URL_REGEX: ECOMP_URL_REGEX, +// userProfileService: userProfileServiceMock +// }); +// }; +// +// /** +// * MOCK DATA +// */ +// let newWidgetModel = { +// name: null, +// appId: null, +// appName: null, +// width: 360, +// height: 300, +// url: null +// }; +// let exsistingWidget = { +// name: 'some widget', +// appId: 1, +// appName: 'APP NAME', +// width: 360, +// height: 300, +// url: 'http://a.com' +// }; +// let adminApps = [{id: 1, name: 'a'}, {id: 2, name: 'b'}]; +// +// /** +// * TEST CASES +// */ +// it('should initialize controller with new widget mode when opening the modal without selected widget', ()=> { +// expect(widgetDetails.widget).toEqual(newWidgetModel); +// }); +// +// it('should initialize controller with exsisting widget details when opening the modal with selected widget', ()=> { +// scope.ngDialogData = { +// widget: exsistingWidget +// }; +// createController(scope); +// expect(widgetDetails.widget).toEqual(exsistingWidget); +// }); +// +// it('should populate widget selected app name and id when initializing controller with widget', () =>{ +// deferredAdminApps.resolve(adminApps); +// scope.ngDialogData = { +// widget: exsistingWidget +// }; +// createController(scope); +// scope.$apply(); +// expect(widgetDetails.widget.appId).toEqual(adminApps[0].id); +// expect(widgetDetails.widget.appName).toEqual(adminApps[0].name); +// }); +// +// //TODO: +// //save changes fail - conflict handling +// //save changes success +// +// +// +// }); diff --git a/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.modal.html b/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.modal.html index 46a5b1c7..0f77ef63 100644 --- a/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.modal.html +++ b/ecomp-portal-FE-common/client/app/views/widgets/widget-details-dialog/widget-details.modal.html @@ -1,152 +1,152 @@ - -
-
Widget Details
- -
-
- - -
-
Application Name
-
- -
-
-
- Application is required -
-
-
-
-
Widget Name
- - -
- -
-
-
- Widget Name is required - Widget Name must be letters, numbers, or underscore -
-
-
-
-
-
Width
- - -
-
- Widget width is required - Minimum width is 300 -
-
-
-
-
Height
- - -
-
- Widget height is required - Minimum height is 200 -
-
-
-
-
-
URL
- - - - -
- -
-
-
- Widget URL is required - Incorrect URL pattern -
- -
- -
-
-
-
- -
Save
-
Cancel
-
-
+ +
+
Widget Details
+ +
+
+ + +
+
Application Name
+
+ +
+
+
+ Application is required +
+
+
+
+
Widget Name
+ + +
+ +
+
+
+ Widget Name is required + Widget Name must be letters, numbers, or underscore +
+
+
+
+
+
Width
+ + +
+
+ Widget width is required + Minimum width is 300 +
+
+
+
+
Height
+ + +
+
+ Widget height is required + Minimum height is 200 +
+
+
+
+
+
URL
+ + + + +
+ +
+
+
+ Widget URL is required + Incorrect URL pattern +
+ +
+ +
+
+
+
+ +
Save
+
Cancel
+
+
diff --git a/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.js b/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.js index e46f1ce5..1998d6d1 100644 --- a/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.js +++ b/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.js @@ -1,168 +1,168 @@ -/*- - * ================================================================================ - * ECOMP Portal - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ================================================================================ - */ -'use strict'; -(function () { - class WidgetsCtrl { - constructor($log, applicationsService, widgetsService, ngDialog, confirmBoxService, - userProfileService, $cookies, $scope, $rootScope) { - //$log.info('WidgetsCtrl::init: Starting Up'); - $scope.infoMessage = true; - $rootScope.noWidgets = false; - - let populateAvailableApps = widgets => { - let allPortalsFilterObject = {index: 0, title: 'All applications', value: ''}; - this.availableApps = [allPortalsFilterObject]; - this.filterByApp = this.availableApps[0]; - applicationsService.getAppsForSuperAdminAndAccountAdmin().then(myApps => { - var reSortedApp = myApps.sort(getSortOrder("name")); - var realAppIndex = 1; - for (let i = 1; i <= reSortedApp.length; i++) { - if (!reSortedApp[i-1].restrictedApp) { - $log.debug('WidgetsCtrl::populateAvailableApps: pushing {index: ', realAppIndex, 'title: ', reSortedApp[i - 1].name, - 'value: ', reSortedApp[i - 1].name, '}'); - this.availableApps.push({ - index: realAppIndex, - title: reSortedApp[i - 1].name, - value: reSortedApp[i - 1].name - }) - realAppIndex = realAppIndex + 1; - } - } - }).catch(err => { - $log.error(err); - }); - }; - - let getOnboardingWidgets = () => { - this.isLoadingTable = true; - widgetsService.getManagedWidgets().then(res => { - $log.debug('WidgetsCtrl.getOnboardingWidgets:: ' + JSON.stringify(res)); - // if (JSON.stringify(res) === '[]') { - // confirmBoxService.showInformation('There are currently no Widgets. ').then(isConfirmed => {}); - // } - var reSortedWidget = res.sort(getSortOrder("name")); - this.widgetsList = reSortedWidget; - populateAvailableApps(reSortedWidget); - // $log.info('WidgetsHomeCtrl::getUserWidgets count : ' + $scope.widgetsList.length); - if (Object.keys(res).length === 0 ) { - $rootScope.noWidgets = true; - $scope.isLoadingTable = false; - $log.info('WidgetsHomeCtrl::getUserWidgets: There are no available Widgets'); - } - }).catch(err => { - confirmBoxService.showInformation('There was a problem retrieving the Widgets. ' + - 'Please try again later.').then(isConfirmed => {}); - $log.error('WidgetsCtrl::getOnboardingWidgets error: ' + err); - }).finally(()=> { - this.isLoadingTable = false; - }); - }; - - // Refactor this into a directive - let getSortOrder = (prop) => { - return function(a, b) { - // $log.debug('a = ' + JSON.stringify(a) + "| b = " + JSON.stringify(b)); - if (a[prop].toLowerCase() > b[prop].toLowerCase()) { - return 1; - } else if (a[prop].toLowerCase() < b[prop].toLowerCase()) { - return -1; - } - return 0; - } - } - - $scope.hideMe = function () { - $scope.infoMessage = false; - } - - let init = () => { - this.isLoadingTable = false; - getOnboardingWidgets(); - - /*Table general configuration params*/ - this.searchString = ''; - /*Table data*/ - this.widgetsTableHeaders = [ - {name: 'Widget Name', value: 'name', isSortable: false}, - {name: 'Application', value: 'appName', isSortable: true}, - {name: 'Width', value: 'width', isSortable: false}, - {name: 'Height', value: 'height', isSortable: false} - ]; - this.widgetsList = []; - }; - - this.filterByDropdownValue = item => { - if(this.filterByApp.value === ''){ - return true; - } - return item.appName === this.filterByApp.value; - }; - - this.openWidgetDetailsModal = (selectedWidget) => { - let data = null; - if(selectedWidget){ - if(!selectedWidget.id){ - $log.error('Widget id not found'); - return; - } - data = { - widget: selectedWidget - } - } - ngDialog.open({ - templateUrl: 'app/views/widgets/widget-details-dialog/widget-details.modal.html', - controller: 'WidgetDetailsModalCtrl', - controllerAs: 'widgetDetails', - data: data - }).closePromise.then(needUpdate => { - if(needUpdate.value === true){ - $log.debug('WidgetsCtrl::openWidgetDetailsModal: updating table data...'); - getOnboardingWidgets(); - } - }); - }; - - this.deleteWidget = widget => { - confirmBoxService.deleteItem(widget.name).then(isConfirmed => { - if(isConfirmed){ - if(!widget || !widget.id){ - $log.error('WidgetsCtrl::deleteWidget: No widget or ID... cannot delete'); - return; - } - widgetsService.deleteWidget(widget.id).then(() => { - this.widgetsList.splice(this.widgetsList.indexOf(widget), 1); - }).catch(err => { - $log.error('WidgetsCtrl::deleteWidget error:',err); - confirmBoxService.showInformation('There was a problem deleting the Widget. ' + - 'Please try again later.').then(isConfirmed => {}); - }); - } - }).catch(err => { - $log.error('WidgetsCtrl::deleteWidget error:',err); - }); - }; - - init(); - } - } - WidgetsCtrl.$inject = ['$log', 'applicationsService', 'widgetsService', 'ngDialog', 'confirmBoxService', - 'userProfileService','$cookies', '$scope', '$rootScope']; - angular.module('ecompApp').controller('WidgetsCtrl', WidgetsCtrl); -})(); +/*- + * ================================================================================ + * ECOMP Portal + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +'use strict'; +(function () { + class WidgetsCtrl { + constructor($log, applicationsService, widgetsService, ngDialog, confirmBoxService, + userProfileService, $cookies, $scope, $rootScope) { + //$log.info('WidgetsCtrl::init: Starting Up'); + $scope.infoMessage = true; + $rootScope.noWidgets = false; + + let populateAvailableApps = widgets => { + let allPortalsFilterObject = {index: 0, title: 'All applications', value: ''}; + this.availableApps = [allPortalsFilterObject]; + this.filterByApp = this.availableApps[0]; + applicationsService.getAppsForSuperAdminAndAccountAdmin().then(myApps => { + var reSortedApp = myApps.sort(getSortOrder("name")); + var realAppIndex = 1; + for (let i = 1; i <= reSortedApp.length; i++) { + if (!reSortedApp[i-1].restrictedApp) { + $log.debug('WidgetsCtrl::populateAvailableApps: pushing {index: ', realAppIndex, 'title: ', reSortedApp[i - 1].name, + 'value: ', reSortedApp[i - 1].name, '}'); + this.availableApps.push({ + index: realAppIndex, + title: reSortedApp[i - 1].name, + value: reSortedApp[i - 1].name + }) + realAppIndex = realAppIndex + 1; + } + } + }).catch(err => { + $log.error(err); + }); + }; + + let getOnboardingWidgets = () => { + this.isLoadingTable = true; + widgetsService.getManagedWidgets().then(res => { + $log.debug('WidgetsCtrl.getOnboardingWidgets:: ' + JSON.stringify(res)); + // if (JSON.stringify(res) === '[]') { + // confirmBoxService.showInformation('There are currently no Widgets. ').then(isConfirmed => {}); + // } + var reSortedWidget = res.sort(getSortOrder("name")); + this.widgetsList = reSortedWidget; + populateAvailableApps(reSortedWidget); + // $log.info('WidgetsHomeCtrl::getUserWidgets count : ' + $scope.widgetsList.length); + if (Object.keys(res).length === 0 ) { + $rootScope.noWidgets = true; + $scope.isLoadingTable = false; + $log.info('WidgetsHomeCtrl::getUserWidgets: There are no available Widgets'); + } + }).catch(err => { + confirmBoxService.showInformation('There was a problem retrieving the Widgets. ' + + 'Please try again later.').then(isConfirmed => {}); + $log.error('WidgetsCtrl::getOnboardingWidgets error: ' + err); + }).finally(()=> { + this.isLoadingTable = false; + }); + }; + + // Refactor this into a directive + let getSortOrder = (prop) => { + return function(a, b) { + // $log.debug('a = ' + JSON.stringify(a) + "| b = " + JSON.stringify(b)); + if (a[prop].toLowerCase() > b[prop].toLowerCase()) { + return 1; + } else if (a[prop].toLowerCase() < b[prop].toLowerCase()) { + return -1; + } + return 0; + } + } + + $scope.hideMe = function () { + $scope.infoMessage = false; + } + + let init = () => { + this.isLoadingTable = false; + getOnboardingWidgets(); + + /*Table general configuration params*/ + this.searchString = ''; + /*Table data*/ + this.widgetsTableHeaders = [ + {name: 'Widget Name', value: 'name', isSortable: false}, + {name: 'Application', value: 'appName', isSortable: true}, + {name: 'Width', value: 'width', isSortable: false}, + {name: 'Height', value: 'height', isSortable: false} + ]; + this.widgetsList = []; + }; + + this.filterByDropdownValue = item => { + if(this.filterByApp.value === ''){ + return true; + } + return item.appName === this.filterByApp.value; + }; + + this.openWidgetDetailsModal = (selectedWidget) => { + let data = null; + if(selectedWidget){ + if(!selectedWidget.id){ + $log.error('Widget id not found'); + return; + } + data = { + widget: selectedWidget + } + } + ngDialog.open({ + templateUrl: 'app/views/widgets/widget-details-dialog/widget-details.modal.html', + controller: 'WidgetDetailsModalCtrl', + controllerAs: 'widgetDetails', + data: data + }).closePromise.then(needUpdate => { + if(needUpdate.value === true){ + $log.debug('WidgetsCtrl::openWidgetDetailsModal: updating table data...'); + getOnboardingWidgets(); + } + }); + }; + + this.deleteWidget = widget => { + confirmBoxService.deleteItem(widget.name).then(isConfirmed => { + if(isConfirmed){ + if(!widget || !widget.id){ + $log.error('WidgetsCtrl::deleteWidget: No widget or ID... cannot delete'); + return; + } + widgetsService.deleteWidget(widget.id).then(() => { + this.widgetsList.splice(this.widgetsList.indexOf(widget), 1); + }).catch(err => { + $log.error('WidgetsCtrl::deleteWidget error:',err); + confirmBoxService.showInformation('There was a problem deleting the Widget. ' + + 'Please try again later.').then(isConfirmed => {}); + }); + } + }).catch(err => { + $log.error('WidgetsCtrl::deleteWidget error:',err); + }); + }; + + init(); + } + } + WidgetsCtrl.$inject = ['$log', 'applicationsService', 'widgetsService', 'ngDialog', 'confirmBoxService', + 'userProfileService','$cookies', '$scope', '$rootScope']; + angular.module('ecompApp').controller('WidgetsCtrl', WidgetsCtrl); +})(); diff --git a/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.spec.js b/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.spec.js index 3841a2b3..32cc3a1f 100644 --- a/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.spec.js +++ b/ecomp-portal-FE-common/client/app/views/widgets/widgets.controller.spec.js @@ -1,19 +1,19 @@ -/*- - * ================================================================================ - * ECOMP Portal - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ================================================================================ - */ +/*- + * ================================================================================ + * ECOMP Portal + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ diff --git a/ecomp-portal-FE-common/client/app/views/widgets/widgets.tpl.html b/ecomp-portal-FE-common/client/app/views/widgets/widgets.tpl.html index 8afb8267..9d6f66f8 100644 --- a/ecomp-portal-FE-common/client/app/views/widgets/widgets.tpl.html +++ b/ecomp-portal-FE-common/client/app/views/widgets/widgets.tpl.html @@ -1,81 +1,81 @@ - -
-
-
-
Widget Onboarding
-
-
-
-
-
- - -
Add Widget
-
-
- Only widgets for active applications are displayed. - -
-
- There are currently no widgets available. -
- - -
- - - - - - - - - - - - - - - -
{{header.name}}URLDelete
-
-
-
-
-
-
-
-
-
-
- -
+ +
+
+
+
Widget Onboarding
+
+
+
+
+
+ + +
Add Widget
+
+
+ Only widgets for active applications are displayed. + +
+
+ There are currently no widgets available. +
+ + +
+ + + + + + + + + + + + + + + +
{{header.name}}URLDelete
+
+
+
+
+
+
+
+
+
+
+ +
-- cgit 1.2.3-korg