summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Lott (cl778h) <clott@research.att.com>2017-07-10 14:04:15 -0400
committerChristopher Lott (cl778h) <clott@research.att.com>2017-07-10 14:10:04 -0400
commit99565bb6bd87cfc46591cea73985c58c3a3697dd (patch)
tree3d90220524af46b157a3fc9d7c555c711452c139
parentfec1ab242c9086a32b04e3ded4518dd20eeca7d3 (diff)
[PORTAL-20,PORTAL-23,PORTAL-32] Repair defects
PORTAL-20: remove mariadb client reference from be-common pom PORTAL-23: Release Portal's SDK version 1.1.0 PORTAL-32: API URL correction for onboarded Apps Change-Id: If75b54ca9202f94ce63c59343b94384da1040912 Signed-off-by: Christopher Lott (cl778h) <clott@research.att.com>
-rw-r--r--deliveries/Apps_Users_OnBoarding_Script.sql18
-rw-r--r--deliveries/README.md1
-rw-r--r--ecomp-portal-BE-common-test/pom.xml2
-rw-r--r--ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/UserRecommendationControllerTest.java69
-rw-r--r--ecomp-portal-BE-common/pom.xml11
-rw-r--r--ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/UserRecommendationController.java87
-rw-r--r--ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/listener/HealthMonitor.java76
-rw-r--r--ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/UserRolesCommonServiceImpl.java32
-rw-r--r--ecomp-portal-BE-common/src/main/webapp/WEB-INF/fusion/orm/EP.hbm.xml16
-rw-r--r--ecomp-portal-BE-os/pom.xml8
-rw-r--r--ecomp-portal-DB-os/EcompPortalDMLMySql_1707_OS.sql13
-rw-r--r--ecomp-portal-FE-common/.gitignore1
-rw-r--r--ecomp-portal-FE-common/client/app/filters/pagination-start-from/start-from.filter.js30
-rw-r--r--ecomp-portal-FE-common/client/app/services/recommendation/recommendation.service.js88
-rw-r--r--ecomp-portal-FE-common/client/app/views/catalog/add-catalog-dialogs/new-catalog.modal.less125
-rw-r--r--ecomp-portal-FE-common/client/app/views/catalog/catalog.controller.js16
-rw-r--r--ecomp-portal-FE-common/client/app/views/catalog/catalog.tpl.html14
-rw-r--r--ecomp-portal-FE-common/client/app/views/catalog/information-box.tpl.html12
-rw-r--r--ecomp-portal-FE-common/client/app/views/dashboard/dashboard.controller.js990
-rw-r--r--ecomp-portal-FE-common/client/app/views/header/header.controller.js81
-rw-r--r--ecomp-portal-FE-common/client/app/views/header/header.tpl.html61
-rw-r--r--ecomp-portal-FE-common/client/app/views/support/get-access/get-access.controller.js24
-rw-r--r--ecomp-portal-FE-common/client/app/views/support/get-access/get-access.tpl.html4
-rw-r--r--ecomp-portal-FE-common/client/app/views/users/new-user-dialogs/bulk-user.controller.js2
-rw-r--r--ecomp-portal-FE-common/client/app/views/widget-onboarding/widget-onboarding.controller.js9
-rw-r--r--ecomp-portal-FE-os/client/src/directives/search-users/search-users.less4
-rw-r--r--ecomp-portal-FE-os/client/src/services/recommendation/recommendation.service.js24
-rw-r--r--ecomp-portal-FE-os/client/src/services/userProfile/userProfile.service.js2
-rw-r--r--ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.controller.js218
-rw-r--r--ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.modal.html113
-rw-r--r--ecomp-portal-FE-os/client/src/views/catalog/get-accessswitch.html10
-rw-r--r--ecomp-portal-FE-os/client/src/views/footer/footer.controller.js16
-rw-r--r--ecomp-portal-FE-os/client/src/views/footer/footer.tpl.html11
-rw-r--r--ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.controller.js20
-rw-r--r--ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.tpl.html21
35 files changed, 768 insertions, 1461 deletions
diff --git a/deliveries/Apps_Users_OnBoarding_Script.sql b/deliveries/Apps_Users_OnBoarding_Script.sql
index 64edfc3d..73468d31 100644
--- a/deliveries/Apps_Users_OnBoarding_Script.sql
+++ b/deliveries/Apps_Users_OnBoarding_Script.sql
@@ -5,10 +5,10 @@ SET FOREIGN_KEY_CHECKS=1;
INSERT INTO `fn_app` (`app_id`, `app_name`, `app_image_url`, `app_description`, `app_notes`, `app_url`, `app_alternate_url`, `app_rest_endpoint`, `ml_app_name`, `ml_app_admin_id`, `mots_id`, `app_password`, `open`, `enabled`, `thumbnail`, `app_username`, `ueb_key`, `ueb_secret`, `ueb_topic_name`, `app_type`) VALUES
-(2, 'xDemo App', 'images/cache/portal-222865671_37476.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/welcome.htm', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/api', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
-(3, 'DMaaP Bus Ctrl', 'images/cache/portal944583064_80711.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/dbc#/dmaap', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/api', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
-(4, 'SDC', 'images/cache/portal956868231_53879.png', NULL, NULL, 'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal', NULL, 'http://sdc.api.simpledemo.openecomp.org:8080/api/', '', '', NULL, '78ot0W94rpB0o4FYzVoIOg==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
-(5, 'Policy', 'images/cache/portal1470452815_67021.png', NULL, NULL, 'http://policy.api.simpledemo.openecomp.org:8443/ecomp/policy#/Editor', NULL, 'http://policy.api.simpledemo.openecomp.org:8443/ecomp/api', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
+(2, 'xDemo App', 'images/cache/portal-222865671_37476.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/welcome.htm', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPSDKAPP/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
+(3, 'DMaaP Bus Ctrl', 'images/cache/portal944583064_80711.png', NULL, NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/dbc#/dmaap', NULL, 'http://portal.api.simpledemo.openecomp.org:8989/ECOMPDBCAPP/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
+(4, 'SDC', 'images/cache/portal956868231_53879.png', NULL, NULL, 'http://sdc.api.simpledemo.openecomp.org:8181/sdc1/portal', NULL, 'http://sdc.api.simpledemo.openecomp.org:8080/api/v2', '', '', NULL, '78ot0W94rpB0o4FYzVoIOg==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
+(5, 'Policy', 'images/cache/portal1470452815_67021.png', NULL, NULL, 'http://policy.api.simpledemo.openecomp.org:8443/ecomp/policy#/Editor', NULL, 'http://policy.api.simpledemo.openecomp.org:8443/ecomp/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
(6, 'Virtual Infrastructure Deployment', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://vid.api.simpledemo.openecomp.org:8080/vid/welcome.htm', NULL, 'http://vid.api.simpledemo.openecomp.org:8080/vid/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1),
(7, 'A&AI UI', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://aai.ui.simpledemo.openecomp.org:9517/services/aai/webapp/index.html#/viewInspect', NULL, 'http://aai.ui.simpledemo.openecomp.org:9517/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1);
@@ -345,4 +345,14 @@ select * from fn_role where app_id = (select app_id from fn_app where app_name =
) b
);
-- end new
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (6,'NEWS','http://about.att.com/innovationblog/next_att_labs','What\s Next at AT&T Labs? AI Set to Revolutionize the Network',NULL,NULL,10);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (7,'NEWS','http://about.att.com/innovationblog/ecomp_code','Code, Community and Commitment – the 3 Cs of Open Source',NULL,NULL,20);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (8,'NEWS','http://about.att.com/story/orange_testing_att_open_source_ecomp_platform.html','Orange Testing AT&Ts Open Source ECOMP Platform for Building Software-Defined Network Capabilities',NULL,NULL,30);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (9,'NEWS', 'http://about.att.com/innovationblog/linux_foundation','Opening up ECOMP: Our Network Operating System for SDN',NULL,NULL,40);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (10,'EVENTS',NULL,'OpenECOMP Launches into Open Source',NULL,'2017-02-14',1);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (11,'IMPORTANTRESOURCES','http://about.att.com/content/dam/snrdocs/ecomp.pdf','ECOMP White Paper',NULL,NULL,1);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (12,'IMPORTANTRESOURCES','https://wiki.onap.org/','ONAP Wiki',NULL,NULL,2);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (13,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Portal','ONAP Wiki, Portal',NULL,NULL,3);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (14,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Development+Guides','ONAP User Guide',NULL,NULL,4);
+
commit;
diff --git a/deliveries/README.md b/deliveries/README.md
new file mode 100644
index 00000000..bc9bc3fe
--- /dev/null
+++ b/deliveries/README.md
@@ -0,0 +1 @@
+ "moved insert statement to fn_common_widget_data table from EcompPortalDMLMySql_1707_OS.sql to Apps_Users_OnBoarding_Script.sql, the Onboard script in deliveries folder".
diff --git a/ecomp-portal-BE-common-test/pom.xml b/ecomp-portal-BE-common-test/pom.xml
index a2090cf1..93e153fa 100644
--- a/ecomp-portal-BE-common-test/pom.xml
+++ b/ecomp-portal-BE-common-test/pom.xml
@@ -4,7 +4,7 @@
<groupId>org.openecomp.portal</groupId>
<artifactId>ecomp-portal-BE-common-test</artifactId>
- <version>1.1.0-SNAPSHOT</version>
+ <version>1.1.0</version>
<packaging>jar</packaging>
<name>ecompportal-be-common-test</name>
diff --git a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/UserRecommendationControllerTest.java b/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/UserRecommendationControllerTest.java
deleted file mode 100644
index 8c0a5cd3..00000000
--- a/ecomp-portal-BE-common-test/src/main/java/org/openecomp/portalapp/portal/test/controller/UserRecommendationControllerTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.openecomp.portalapp.portal.test.controller;
-
-import static org.junit.Assert.assertTrue;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.MockitoAnnotations;
-import org.openecomp.portalapp.portal.controller.UserRecommendationController;
-import org.openecomp.portalapp.portal.test.core.MockEPUser;
-import org.openecomp.portalapp.test.framework.MockitoTestSuite;
-import org.openecomp.portalsdk.core.web.support.UserUtils;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(UserUtils.class)
-public class UserRecommendationControllerTest {
-
- /*
- * @Mock FunctionalMenuService functionalMenuService = new
- * FunctionalMenuServiceImpl();
- *
- * @Mock UserNotificationService userNotificationService = new
- * UserNotificationServiceImpl();
- */
-
- @InjectMocks
- UserRecommendationController userRecommendationController = new UserRecommendationController();
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
- }
-
- MockEPUser mockUser = new MockEPUser();
- MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
-
- HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
- HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
- NullPointerException nullPointerException = new NullPointerException();
-
-
- @Test
- public void getRecommendationsTest() throws Exception {
- String recommendations = "{\"id\": \"USERID\", \"timestamp\": \"TIMESTAMP\", \"count\": \"count of recommendations returned\",\"recommendations\": [\"recommended action 1\",\"recommended action 2\"] }";
- // String actualPortalRestResponse = null;
- String actualPortalRestResponse = recommendations;
- actualPortalRestResponse = userRecommendationController.getRecommendations(mockedRequest, mockedResponse);
- assertTrue(actualPortalRestResponse.equals(actualPortalRestResponse));
-
- }
-
- @Test
- public void getRecommendationsTestForRecommendations() throws Exception {
- String recommendations = "{\"id\": \"USERID\", \"timestamp\": \"TIMESTAMP\", \"count\": \"count of recommendations returned\" }";
- // String actualPortalRestResponse = null;
- String actualPortalRestResponse = recommendations;
- actualPortalRestResponse = userRecommendationController.getRecommendations(mockedRequest, mockedResponse);
- assertTrue(actualPortalRestResponse.equals(actualPortalRestResponse));
-
- }
-
-
-}
diff --git a/ecomp-portal-BE-common/pom.xml b/ecomp-portal-BE-common/pom.xml
index bff7ed21..bf5f9f1a 100644
--- a/ecomp-portal-BE-common/pom.xml
+++ b/ecomp-portal-BE-common/pom.xml
@@ -5,14 +5,14 @@
<artifactId>ecompportal-be-common</artifactId>
<packaging>war</packaging>
<!-- Version number is managed manually; no Jenkins build.number -->
- <version>1.1.0-SNAPSHOT</version>
+ <version>1.1.0</version>
<properties>
<springframework.version>4.2.0.RELEASE</springframework.version>
<hibernate.version>4.3.11.Final</hibernate.version>
<eelf.version>1.0.0</eelf.version>
<fasterxml.version>2.7.4</fasterxml.version>
- <epsdk.version>1.1.0-SNAPSHOT</epsdk.version>
+ <epsdk.version>1.1.0</epsdk.version>
<encoding>UTF-8</encoding>
<!-- Tests usually require some setup that maven cannot do, so skip. -->
<skipTests>true</skipTests>
@@ -367,13 +367,6 @@
<version>9.1-901-1.jdbc4</version>
</dependency>
- <!-- Use Mariadb connector/j for failover -->
- <dependency>
- <groupId>org.mariadb.jdbc</groupId>
- <artifactId>mariadb-java-client</artifactId>
- <version>1.5.8</version>
- </dependency>
-
<!-- Elastic Search -->
<dependency>
<groupId>org.elasticsearch</groupId>
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/UserRecommendationController.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/UserRecommendationController.java
deleted file mode 100644
index 3ec06ed3..00000000
--- a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/controller/UserRecommendationController.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.openecomp.portalapp.portal.controller;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.openecomp.portalapp.controller.EPRestrictedBaseController;
-import org.openecomp.portalapp.portal.domain.EPUser;
-import org.openecomp.portalapp.portal.logging.aop.EPAuditLog;
-import org.openecomp.portalapp.portal.service.ConsulHealthService;
-import org.openecomp.portalapp.util.EPUserUtils;
-import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
-import org.openecomp.portalsdk.core.util.SystemProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.client.RestTemplate;
-
-@RestController
-@org.springframework.context.annotation.Configuration
-@EnableAspectJAutoProxy
-@EPAuditLog
-public class UserRecommendationController extends EPRestrictedBaseController {
-
- private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(UserRecommendationController.class);
-
- @Autowired
- private ConsulHealthService consulHealthService;
-
- private static final String MACHINE_LEARNING_SERVICE_CTX = "/ml_api";
- private static final String GET_RECOMMENDATION = MACHINE_LEARNING_SERVICE_CTX + "/" + "getRecommendation";
- private static final String GET_RECOMM_COUNT = MACHINE_LEARNING_SERVICE_CTX + "/" + "getRecommCount";
- private static final String CONSUL_ML_SERVICE_ID = "mlearning-service";
- private static final String SERVICE_PROTOCOL = "http";
-
- @RequestMapping(value = {
- "/portalApi/getRecommendationsCount" }, method = RequestMethod.GET, produces = "application/json")
- public String getRecommendationsCount(HttpServletRequest request, HttpServletResponse response) {
- EPUser user = EPUserUtils.getUserSession(request);
- Map<String, String> requestMapping = new HashMap<String, String>();
- requestMapping.put("id", user.getOrgUserId());
- requestMapping.put("action", "reports");
-
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_JSON);
-
- // set your entity to send
- HttpEntity<Map<String,String>> entity = new HttpEntity<>(requestMapping, headers);
- String endpoint = SERVICE_PROTOCOL + "://"+ consulHealthService.getServiceLocation(CONSUL_ML_SERVICE_ID,
- SystemProperties.getProperty("microservices.m-learn.local.port")) + GET_RECOMM_COUNT;
- logger.debug(EELFLoggerDelegate.debugLogger, "Going to hit mlearning endpoint on: {1}", endpoint);
- ResponseEntity<String> out = new RestTemplate().exchange(endpoint, HttpMethod.POST, entity, String.class);
- return out.getBody();
- }
-
- @RequestMapping(value = {
- "/portalApi/getRecommendations" }, method = RequestMethod.GET, produces = "application/json")
- public String getRecommendations(HttpServletRequest request, HttpServletResponse response) {
- EPUser user = EPUserUtils.getUserSession(request);
- Map<String, String> requestMapping = new HashMap<String, String>();
- requestMapping.put("id", user.getOrgUserId());
- requestMapping.put("action", "reports");
- requestMapping.put("recommendations", "1");
-
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.APPLICATION_JSON);
-
- // set your entity to send
- HttpEntity<Map<String,String>> entity = new HttpEntity<>(requestMapping, headers);
- String endpoint = SERVICE_PROTOCOL + "://"+
- consulHealthService.getServiceLocation(CONSUL_ML_SERVICE_ID,
- SystemProperties.getProperty("microservices.m-learn.local.port")) + GET_RECOMMENDATION;
- logger.debug(EELFLoggerDelegate.debugLogger, "Going to hit mlearning endpoint on: {1}", endpoint);
- ResponseEntity<String> out = new RestTemplate().exchange(endpoint, HttpMethod.POST, entity, String.class);
- return out.getBody();
- }
-
-} \ No newline at end of file
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/listener/HealthMonitor.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/listener/HealthMonitor.java
index 9de7a4c9..f9a6b905 100644
--- a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/listener/HealthMonitor.java
+++ b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/listener/HealthMonitor.java
@@ -19,7 +19,6 @@
*/
package org.openecomp.portalapp.portal.listener;
-import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
@@ -28,11 +27,9 @@ import javax.annotation.PreDestroy;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
-import org.openecomp.portalapp.portal.domain.SharedContext;
import org.openecomp.portalapp.portal.logging.aop.EPMetricsLog;
import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;
import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;
-import org.openecomp.portalapp.portal.service.SharedContextService;
import org.openecomp.portalapp.portal.ueb.EPUebHelper;
import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
@@ -47,29 +44,29 @@ import org.springframework.transaction.annotation.Transactional;
@EPMetricsLog
public class HealthMonitor {
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthMonitor.class);
+
@Autowired
private SessionFactory sessionFactory;
@Autowired
private EPUebHelper epUebHelper;
- @Autowired
- private SharedContextService sharedContextService;
-
private static boolean databaseUp;
private static boolean uebUp;
private static boolean frontEndUp;
private static boolean backEndUp;
private static boolean dbClusterStatusOk;
private static boolean dbPermissionsOk;
+
+ /**
+ * Read directly by external classes.
+ */
public static boolean isSuspended = false;
private Thread healthMonitorThread;
- private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthMonitor.class);
-
public HealthMonitor() {
-
}
public static boolean isDatabaseUp() {
@@ -103,7 +100,7 @@ public class HealthMonitor {
int numIntervalsDatabasePermissionsIncorrect = 0;
int numIntervalsUebHasBeenDown = 0;
- logger.debug(EELFLoggerDelegate.debugLogger, "monitorEPHealth started");
+ logger.debug(EELFLoggerDelegate.debugLogger, "monitorEPHealth thread started");
long sleepInterval = (Long
.valueOf(SystemProperties.getProperty(EPCommonSystemProperties.HEALTH_POLL_INTERVAL_SECONDS)) * 1000);
@@ -146,7 +143,7 @@ public class HealthMonitor {
if (dbPermissionsOk == false) {
if ((numIntervalsDatabasePermissionsIncorrect % numIntervalsBetweenAlerts) == 0) {
logger.debug(EELFLoggerDelegate.debugLogger,
- "monitorEPHealth: database permissions not correct, logging to error log to trigger alert.");
+ "monitorEPHealth: database permissions incorrect, logging to error log to trigger alert.");
EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeHealthCheckMySqlError);
numIntervalsDatabasePermissionsIncorrect++;
} else {
@@ -162,8 +159,10 @@ public class HealthMonitor {
//
uebUp = this.checkIfUebUp();
if (uebUp == false) {
+
if ((numIntervalsUebHasBeenDown % numIntervalsBetweenAlerts) == 0) {
- logger.debug(EELFLoggerDelegate.debugLogger, "UEB down, logging to error log to trigger alert");
+ logger.debug(EELFLoggerDelegate.debugLogger,
+ "monitorEPHealth: UEB down, logging to error log to trigger alert");
// Write a Log entry that will generate an alert
EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeHealthCheckUebClusterError);
numIntervalsUebHasBeenDown++;
@@ -189,15 +188,18 @@ public class HealthMonitor {
// could return information in the json content of a health check.
//
+ //
+ // Get DB status. If down, signal alert once every X intervals.
+ //
if (Thread.interrupted()) {
- logger.debug(EELFLoggerDelegate.debugLogger, "monitorEPHealth: interrupted, leaving loop");
+ logger.info(EELFLoggerDelegate.errorLogger, "monitorEPHealth: thread interrupted");
break;
}
try {
Thread.sleep(sleepInterval);
} catch (InterruptedException e) {
- logger.error(EELFLoggerDelegate.errorLogger, "monitorEPHealth interrupted", e);
+ logger.error(EELFLoggerDelegate.errorLogger, "monitorEPHealth: sleep interrupted", e);
Thread.currentThread().interrupt();
}
}
@@ -205,7 +207,6 @@ public class HealthMonitor {
@PostConstruct
public void initHealthMonitor() {
-
healthMonitorThread = new Thread("EP HealthMonitor thread") {
public void run() {
try {
@@ -228,28 +229,35 @@ public class HealthMonitor {
}
/**
- * Writes and reads the database; cleans up when finished.
+ * This routine checks whether the database can be read. In June 2017 we
+ * experimented with checking if the database can be WRITTEN. Writes failed
+ * with some regularity in a MariaDB Galera cluster, and in that
+ * environment, the resulting alerts in the log triggered a health monitor
+ * cron job to shut down the Tomcat instance. The root cause of the cluster
+ * write failures was not determined.
*
- * @return True on success; false otherwise.
+ * @return true if the database can be read.
*/
private boolean checkIfDatabaseUp() {
boolean isUp = false;
+ Session localSession = null;
try {
- final Date now = new Date();
- final String contextId = "checkIfDatabaseUp-" + Long.toString(now.getTime());
- final String key = "checkIfDatabaseUp-key";
- final String value = "checkIfDatabaseUp-value";
- sharedContextService.addSharedContext(contextId, key, value);
- SharedContext sc = sharedContextService.getSharedContext(contextId, key);
- if (sc == null || sc.getCvalue() == null || !value.equals(sc.getCvalue()))
- throw new Exception("Failed to retrieve shared context");
- int removed = sharedContextService.deleteSharedContexts(contextId);
- if (removed != 1)
- throw new Exception("Failed to delete shared context");
- isUp = true;
+ localSession = sessionFactory.openSession();
+ if (localSession != null) {
+ String sql = "select app_name from fn_app where app_id=1";
+ Query query = localSession.createSQLQuery(sql);
+ @SuppressWarnings("unchecked")
+ List<String> queryList = query.list();
+ if (queryList != null) {
+ isUp = true;
+ }
+ }
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, "checkIfDatabaseUp failed", e);
+ logger.debug(EELFLoggerDelegate.debugLogger, "checkIfDatabaseUp failed", e);
isUp = false;
+ } finally {
+ if (localSession != null)
+ localSession.close();
}
return isUp;
}
@@ -273,8 +281,7 @@ public class HealthMonitor {
} catch (Exception e) {
logger.error(EELFLoggerDelegate.errorLogger, "checkClusterStatus failed", e);
if ((e.getCause() != null) && (e.getCause().getMessage() != null)) {
- logger.error(EELFLoggerDelegate.errorLogger,
- "checkClusterStatus() exception cause", e.getCause());
+ logger.error(EELFLoggerDelegate.errorLogger, "checkClusterStatus failure cause", e.getCause());
}
isUp = false;
} finally {
@@ -305,7 +312,7 @@ public class HealthMonitor {
}
if (isUp == false) {
logger.error(EELFLoggerDelegate.errorLogger,
- "checkDatabaseAndPermissions() returning false. SHOW GRANTS FOR CURRENT_USER being dumped:");
+ "checkDatabasePermissions returning false. SHOW GRANTS FOR CURRENT_USER being dumped:");
for (String str : grantsList) {
logger.error(EELFLoggerDelegate.errorLogger, "grants output item = [" + str + "]");
}
@@ -314,8 +321,7 @@ public class HealthMonitor {
} catch (Exception e) {
logger.error(EELFLoggerDelegate.errorLogger, "checkDatabasePermissions failed", e);
if ((e.getCause() != null) && (e.getCause().getMessage() != null)) {
- logger.error(EELFLoggerDelegate.errorLogger,
- "checkDatabasePermissions() exception msg = ", e.getCause());
+ logger.error(EELFLoggerDelegate.errorLogger, "checkDatabasePermissions failure cause", e.getCause());
}
isUp = false;
} finally {
diff --git a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/UserRolesCommonServiceImpl.java b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/UserRolesCommonServiceImpl.java
index 727f83dd..80408954 100644
--- a/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/UserRolesCommonServiceImpl.java
+++ b/ecomp-portal-BE-common/src/main/java/org/openecomp/portalapp/portal/service/UserRolesCommonServiceImpl.java
@@ -243,7 +243,10 @@ public class UserRolesCommonServiceImpl {
if (!userRole.getRoleId().equals(PortalConstants.ACCOUNT_ADMIN_ROLE_ID) && userRole.getRoleId() != PortalConstants.SYS_ADMIN_ROLE_ID && !extRequestValue){
syncUserRolesExtension(userRole, appId, localSession, userAppRoles, newUserAppRolesMap);
}
- else if (extRequestValue){
+ else if (extRequestValue && ("PUT".equals(reqType) || "POST".equals(reqType) || "DELETE".equals(reqType))){
+ syncUserRolesExtension(userRole, appId, localSession, userAppRoles, newUserAppRolesMap);
+ }
+ else if (extRequestValue && !userRole.getRoleId().equals(PortalConstants.ACCOUNT_ADMIN_ROLE_ID)){
syncUserRolesExtension(userRole, appId, localSession, userAppRoles, newUserAppRolesMap);
}
}
@@ -276,15 +279,18 @@ public class UserRolesCommonServiceImpl {
}
EPRole role = null;
for (EcompRole userRole : newRolesToAdd) {
+ EPUserApp userApp = new EPUserApp();
if (("PUT".equals(reqType) || "POST".equals(reqType)) && userRole.getName().equals(PortalConstants.ADMIN_ROLE)) {
role = (EPRole) localSession.get(EPRole.class, new Long(PortalConstants.ACCOUNT_ADMIN_ROLE_ID));
+ userApp.setRole(role);
} else if (userRole.getId().equals(PortalConstants.ACCOUNT_ADMIN_ROLE_ID) && !extRequestValue){
continue;
+ } else {
+ userApp.setRole(rolesMap.get(userRole.getId()));
}
- EPUserApp userApp = new EPUserApp();
+
userApp.setUserId(client.getId());
userApp.setApp(app);
- userApp.setRole(("PUT".equals(reqType) || "POST".equals(reqType) && userRole.getId().equals(PortalConstants.ACCOUNT_ADMIN_ROLE_ID)) ? role : rolesMap.get(userRole.getId()));
localSession.save(userApp);
localSession.flush();
}
@@ -698,7 +704,7 @@ public class UserRolesCommonServiceImpl {
result = true;
} catch (Exception e) {
logger.error(EELFLoggerDelegate.errorLogger,
- "applyChangesInUserRolesForAppToEcompDB: failed to syncUserRoles for attuid " + userId, e);
+ "applyChangesInUserRolesForAppToEcompDB: failed to syncUserRoles for orgUserId " + userId, e);
if("DELETE".equals(reqType)){
throw new Exception(e.getMessage());
}
@@ -953,7 +959,7 @@ public class UserRolesCommonServiceImpl {
* Pushes specified user details to the specified remote app.
*
* @param userId
- * ATT UID identifying user at remote app in REST endpoint path
+ * OrgUserId identifying user at remote app in REST endpoint path
* @param user
* User details to be pushed
* @param app
@@ -1118,10 +1124,10 @@ public class UserRolesCommonServiceImpl {
/*if (userRolesInRemoteApp.size() == 0) {
logger.debug(EELFLoggerDelegate.debugLogger,
"setAppWithUserRoleStateForUser: no roles in app {}, set user {} to inactive", app,
- attuid);
+ orgUserId);
//TODO Need to fix the logged in user is not set to inactive
remoteAppUser.setActive(false);
- postUserToRemoteApp(attuid, user, app, applicationsRestClientService);
+ postUserToRemoteApp(orgUserId, user, app, applicationsRestClientService);
}*/
}
@@ -1189,7 +1195,7 @@ public class UserRolesCommonServiceImpl {
if (existingAppRole == null) {
logger.error(EELFLoggerDelegate.errorLogger, "roleInAppForUserList failed for the roles {}",
roleInAppForUserList);
- throw new Exception("'" +roleInAppForUser.getRoleName() + "'" +" role does not exist for" + appName + " application");
+ throw new Exception("'" +roleInAppForUser.getRoleName() + "'" +" role does not exist for " + appName + " application");
}
if (!existingAppRole.getActive()) {
logger.error(EELFLoggerDelegate.errorLogger, "roleInAppForUserList failed for the roles {}",
@@ -1265,10 +1271,18 @@ public class UserRolesCommonServiceImpl {
public List<RoleInAppForUser> getAppRolesForUser(Long appId, String userId, Boolean extRequestValue) {
List<RoleInAppForUser> rolesInAppForUser = null;
+ List<EPUser> userInfo = null;
try {
// for ecomp portal app, no need to make a remote call
- if (appId == PortalConstants.PORTAL_APP_ID) {
+ if (appId == PortalConstants.PORTAL_APP_ID) {
+ final Map<String, String> userParams = new HashMap<>();
+ userParams.put("orgUserIdValue", userId);
+ userInfo = checkIfUserExists(userParams);
+ if(userInfo.size() == 0 || userInfo.isEmpty())
+ {
+ createLocalUserIfNecessary(userId);
+ }
List<Role> roleList = roleService.getAvailableRoles();
List<Role> activeRoleList = new ArrayList<Role>();
diff --git a/ecomp-portal-BE-common/src/main/webapp/WEB-INF/fusion/orm/EP.hbm.xml b/ecomp-portal-BE-common/src/main/webapp/WEB-INF/fusion/orm/EP.hbm.xml
index 84f7b7ed..eea9467a 100644
--- a/ecomp-portal-BE-common/src/main/webapp/WEB-INF/fusion/orm/EP.hbm.xml
+++ b/ecomp-portal-BE-common/src/main/webapp/WEB-INF/fusion/orm/EP.hbm.xml
@@ -630,13 +630,13 @@
and a.is_for_all_roles = 'N'
) a,
(
- select a.user_id, c.role_id, c.app_id, d.APP_NAME
+ select distinct a.user_id, c.role_id, c.app_id, d.APP_NAME
from fn_user a, fn_user_role b, fn_role c, fn_app d
- where a.user_id = b.user_id
+ where COALESCE(c.app_id,1) = d.app_id
+ and a.user_id = b.user_id
and a.user_id = :user_id
and b.role_id = c.role_id
- and c.app_id = d.app_id
- and d.enabled='Y'
+ and (d.enabled='Y' or d.app_id=1)
)b
where
(
@@ -821,13 +821,13 @@ where fn_role.app_id = fn_app.app_id and fn_app.enabled='Y' order by app_name
)
) a,
(
- select a.user_id, c.role_id, c.app_id, d.APP_NAME
+ select distinct a.user_id, c.role_id, c.app_id, d.APP_NAME
from fn_user a, fn_user_role b, fn_role c, fn_app d
- where a.user_id = b.user_id
+ where COALESCE(c.app_id,1) = d.app_id
+ and a.user_id = b.user_id
and a.user_id = :user_id
and b.role_id = c.role_id
- and c.app_id = d.app_id
- and d.enabled='Y'
+ and (d.enabled='Y' or d.app_id=1)
) b
where
(
diff --git a/ecomp-portal-BE-os/pom.xml b/ecomp-portal-BE-os/pom.xml
index 0e7eb0bd..45927490 100644
--- a/ecomp-portal-BE-os/pom.xml
+++ b/ecomp-portal-BE-os/pom.xml
@@ -11,11 +11,13 @@
<springframework.version>4.2.0.RELEASE</springframework.version>
<hibernate.version>4.3.11.Final</hibernate.version>
<eelf.version>1.0.0</eelf.version>
- <epsdk.version>1.1.0-SNAPSHOT</epsdk.version>
- <portal.version>1.1.0-SNAPSHOT</portal.version>
+ <epsdk.version>1.1.0</epsdk.version>
+ <portal.version>1.1.0</portal.version>
<encoding>UTF-8</encoding>
<!-- Tests usually require some setup that maven cannot do, so skip. -->
<skiptests>false</skiptests>
+ <!-- Jenkins invokes mvn with argument -Dbuild.number=${BUILD_NUMBER} -->
+ <build.number>0</build.number>
<sonar.exclusions>**.js</sonar.exclusions>
<nexusproxy>https://nexus.onap.org</nexusproxy>
<snapshotNexusPath>content/repositories/snapshots/</snapshotNexusPath>
@@ -109,7 +111,7 @@
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
- <Build-Number>${build.number}</Build-Number>
+ <Build-Number>${project.version}.${build.number}</Build-Number>
<Build-Time>${maven.build.timestamp}</Build-Time>
</manifestEntries>
</archive>
diff --git a/ecomp-portal-DB-os/EcompPortalDMLMySql_1707_OS.sql b/ecomp-portal-DB-os/EcompPortalDMLMySql_1707_OS.sql
index bbdba3c3..ace9d45e 100644
--- a/ecomp-portal-DB-os/EcompPortalDMLMySql_1707_OS.sql
+++ b/ecomp-portal-DB-os/EcompPortalDMLMySql_1707_OS.sql
@@ -17,16 +17,9 @@ Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,1,NULL,1);
Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,950,NULL,1);
Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,999,NULL,1);
-
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (6,'NEWS','http://about.att.com/innovationblog/next_att_labs','What\s Next at AT&T Labs? AI Set to Revolutionize the Network',NULL,NULL,10);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (7,'NEWS','http://about.att.com/innovationblog/ecomp_code','Code, Community and Commitment - the 3 Cs of Open Source',NULL,NULL,20);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (8,'NEWS','http://about.att.com/story/orange_testing_att_open_source_ecomp_platform.html','Orange Testing AT&Ts Open Source ECOMP Platform for Building Software-Defined Network Capabilities',NULL,NULL,30);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (9,'NEWS', 'http://about.att.com/innovationblog/linux_foundation','Opening up ECOMP: Our Network Operating System for SDN',NULL,NULL,40);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (10,'EVENTS',NULL,'OpenECOMP Launches into Open Source',NULL,'2017-02-14',1);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (11,'IMPORTANTRESOURCES','http://about.att.com/content/dam/snrdocs/ecomp.pdf','ECOMP White Paper',NULL,NULL,1);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (12,'IMPORTANTRESOURCES','https://openecomp.atlassian.net/wiki/display/DW/Developer+Wiki+for+OpenECOMP','OpenECOMP Wiki',NULL,NULL,2);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (13,'IMPORTANTRESOURCES','https://openecomp.atlassian.net/wiki/display/DW/Portal+and+Dashboard','OpenECOMP Wiki, Portal',NULL,NULL,3);
-INSERT INTO fn_common_widget_data (id,CATEGORY,HREF,TITLE,content,event_date,SORT_ORDER) values (14,'IMPORTANTRESOURCES','https://openecomp.atlassian.net/wiki/display/DW/Portal+and+Dashboard','OpenECOMP User Guide',NULL,NULL,4);
+-- change to inactive for following menu
+update fn_menu set active_yn='N' where menu_id=14; /* web analytics */
+update fn_menu set active_yn='N' where menu_id=16; /* web analytics onboarding*/
INSERT INTO cr_report
(rep_id, title, descr, public_yn, report_xml, create_id, create_date, maint_id, maint_date, menu_id, menu_approved_yn, owner_id, folder_id, dashboard_type_yn, dashboard_yn)
diff --git a/ecomp-portal-FE-common/.gitignore b/ecomp-portal-FE-common/.gitignore
index a82f9459..2b964313 100644
--- a/ecomp-portal-FE-common/.gitignore
+++ b/ecomp-portal-FE-common/.gitignore
@@ -1,3 +1,4 @@
.classpath
.project
+/.settings/
/target/
diff --git a/ecomp-portal-FE-common/client/app/filters/pagination-start-from/start-from.filter.js b/ecomp-portal-FE-common/client/app/filters/pagination-start-from/start-from.filter.js
new file mode 100644
index 00000000..1bf33987
--- /dev/null
+++ b/ecomp-portal-FE-common/client/app/filters/pagination-start-from/start-from.filter.js
@@ -0,0 +1,30 @@
+/*-
+ * ================================================================================
+ * 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';
+
+angular.module('ecompApp')
+ .filter('startFrom', () => {
+ return function (input, start) {
+ if (!input || !input.length) { return; }
+
+ start = +start;
+ return input.slice(start);
+ };
+ });
diff --git a/ecomp-portal-FE-common/client/app/services/recommendation/recommendation.service.js b/ecomp-portal-FE-common/client/app/services/recommendation/recommendation.service.js
deleted file mode 100644
index aa2a4631..00000000
--- a/ecomp-portal-FE-common/client/app/services/recommendation/recommendation.service.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/*-
- * ================================================================================
- * 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 wl849v on 12/14/2016.
- */
-'use strict';
-(function () {
- class RecommendationService {
- constructor($q, $log, $http, conf, uuid,utilsService) {
- this.$q = $q;
- this.$log = $log;
- this.$http = $http;
- this.conf = conf;
- this.uuid = uuid;
- this.recommendationCount = {count:0};
- this.refreshCount = 0;
- this.maxCount = 0;
- this.utilsService = utilsService;
- }
- getRecommendationCount() {
- return this.recommendationCount;
- }
- setRecommendationCount(count) {
- this.recommendationCount.count = count;
- }
- getRefreshCount() {
- return this.refreshCount;
- }
- setRefreshCount(count){
- this.refreshCount = count;
- }
- setMaxRefreshCount(count){
- this.maxCount = count;
- }
- decrementRefreshCount(){
- this.refreshCount = this.refreshCount - 1;
- }
-
-
- getRecommendations(){
- let deferred = this.$q.defer();
- this.$http({
- method: "GET",
- cache: false,
- url: this.conf.api.getRecommendations,
- headers: {
- 'X-ECOMP-RequestID':this.uuid.generate()
- }
- })
- .then( res => {
- // If response comes back as a redirected HTML page which IS NOT a success
- if (this.utilsService.isValidJSON(res.data)=== false) {
- this.$log.error('NotificationService::getRecommendations Failed');
- deferred.reject("NotificationService::getRecommendations Failed");
- } else {
- deferred.resolve(res);
- }
- })
- .catch( status => {
- this.$log.error('NotificationService::getRecommendations Failed', status);
- deferred.reject(status);
- });
-
- return deferred.promise;
- }
-
-
- }
- RecommendationService.$inject = ['$q', '$log', '$http', 'conf', 'uuid4','utilsService'];
- angular.module('ecompApp').service('recommendationService', RecommendationService)
-})();
diff --git a/ecomp-portal-FE-common/client/app/views/catalog/add-catalog-dialogs/new-catalog.modal.less b/ecomp-portal-FE-common/client/app/views/catalog/add-catalog-dialogs/new-catalog.modal.less
deleted file mode 100644
index 5568ca8e..00000000
--- a/ecomp-portal-FE-common/client/app/views/catalog/add-catalog-dialogs/new-catalog.modal.less
+++ /dev/null
@@ -1,125 +0,0 @@
-.new-catalog-modal {
- height: 430px;
-
- .user-catalog-roles{
- .title{
- //.n18r;
- .dGray18r; //AT&T Dark Gray
- border-bottom: @portalDBlue 3px solid;
- }
-
- input:not([type="button"]) {
- height: 13px;
-}
- .display-userApp-Catalog-Roles
- {
- padding-left: 16px;
- padding-top: 10px;
- font-family: Omnes-ECOMP-W02,Arial;
- font-size: 18px;
- color: #5a5a5a;
- }
-
- #pending-checkbox{
- font-family: Omnes-ECOMP-W02,Arial;
- font-size: 15px;
- color: #5a5a5a;
- }
- .app-catalog-roles-list{
- height: 286px;
-
-
- .app-catalog-item{
- border: 1px solid @portalLGray;
- border-radius: 2px;
- background-color: @funcBkgGray;
-
- padding: 10px;
- margin-top: 8px;
- //margin-right: 6px;
- //margin-left: 6px;
-
- .app-catalog-item-left{
- padding-top: 0;
- line-height: 30px;
- height: 30px;
- vertical-align: middle;
- display:inline-block;
- width: 45%;
- border-radius: 2px;
- border: 1px solid @portalLGray;
- margin-right: 10px;
- padding-left: 4px;
- background: @portalWhite;
- white-space: nowrap;
-
- }
- .app-catalog-item-right{
- display:inline-block;
- width: 45%;
- border-radius: 2px;
- border: 1px solid @portalLGray;
- background: @portalWhite;
- vertical-align: middle;
- }
-
- .app-catalog-item-right-error{
- .portalRed;
- padding: 7px 7px 7px 7px;
- display:inline-block;
- width: 45%;
- border-radius: 2px;
- border: 1px solid @portalLGray;
- background: @portalWhite;
- vertical-align: middle;
- }
-
- .app-catalog-item-right-contacting{
- .portalGreen;
- padding: 7px 7px 7px 7px;
- display:inline-block;
- width: 45%;
- border-radius: 2px;
- border: 1px solid @portalLGray;
- background: @portalWhite;
- vertical-align: middle;
- }
-
- .app-select-left{
- width: 45%;
- margin-right: 10px;
- vertical-align: middle;
-
-
- .select-field{
- padding-top: 0;
- line-height: 30px;
- height: 30px;
- vertical-align: middle;
- border-radius: 2px;
- border: 1px solid @portalLGray;
- margin-right: 10px;
- padding-left: 4px;
- background: @portalWhite;
- display:inline-block;
- }
- }
-
-
- .app-item-delete{
- .ico_trash_default;
- display: inline-block;
- vertical-align: 2px;
- cursor: pointer;
- position: relative;
- top: 6px;
- color: transparent;
- margin-left: 8px;
-
- }
-
- }
- }
-
- }
-}
diff --git a/ecomp-portal-FE-common/client/app/views/catalog/catalog.controller.js b/ecomp-portal-FE-common/client/app/views/catalog/catalog.controller.js
index 150a305e..1685c133 100644
--- a/ecomp-portal-FE-common/client/app/views/catalog/catalog.controller.js
+++ b/ecomp-portal-FE-common/client/app/views/catalog/catalog.controller.js
@@ -60,6 +60,13 @@ function _classCallCheck(instance, Constructor) {
getExternalAccess();
};
+ this.getAccess = function(item) {
+ if(!item.access)
+ confirmBoxService.showDynamicInformation(item,
+ 'app/views/catalog/information-box.tpl.html','CatalogConfirmationBoxCtrl'
+ ).then(isConfirmed => {});
+ };
+
var getExternalAccess = () => {
ExternalRequestAccessService.getExternalRequestAccessServiceInfo().then(
function(property) {
@@ -125,19 +132,18 @@ function _classCallCheck(instance, Constructor) {
data = {
dialogState: 2,
selectedUser:{
- attuid: $scope.attuid,
+ orgUserId: $scope.orgUserId,
firstName: $scope.firstName,
lastName: $scope.lastName,
headerText: item.headerText,
haloAppName : item.mlAppName,
item: item,
- extReqValue : externalRequest
}
}
ngDialog.open({
- templateUrl: 'app/views/catalog/add-catalog-dialogs/new-catalog.modal.html',
- controller: 'NewCatalogModalCtrl',
+ templateUrl: 'app/views/catalog/request-access-catalog-dialogs/request-access-catalog.modal.html',
+ controller: 'ExternalRequestAccessCtrl',
controllerAs: 'userInfo',
data: data
}).closePromise.then(needUpdate => {
@@ -183,7 +189,7 @@ function _classCallCheck(instance, Constructor) {
.getUserProfile()
.then(
function(profile) {
- $scope.attuid = profile.orgUserId;
+ $scope.orgUserId = profile.orgUserId;
$scope.firstName = profile.firstName;
$scope.lastName = profile.lastName;
$scope.appCatalog = [];
diff --git a/ecomp-portal-FE-common/client/app/views/catalog/catalog.tpl.html b/ecomp-portal-FE-common/client/app/views/catalog/catalog.tpl.html
index b4063ad6..fd71e59b 100644
--- a/ecomp-portal-FE-common/client/app/views/catalog/catalog.tpl.html
+++ b/ecomp-portal-FE-common/client/app/views/catalog/catalog.tpl.html
@@ -58,18 +58,8 @@
</label>
<i ng-show="item.pending" class="icon-tickets-contested"></i>
</div>
- </div>
- <div class="gridster-box-content"
- ng-style="{'cursor':'pointer',
- 'background-image': 'url('+(item.imageLink)+')',
- 'order': item.order,
- 'background-color':'white',
- 'background-repeat': 'no-repeat',
- 'background-size': '170px 130px'}"
- ng-click="catalog.openAddRoleModal(item)"
- ng-hide="users.isLoadingTable && !users.getAppCatalogIsDone"
- >
- </div>
+ </div>
+ <div ng-include src="'app/views/catalog/get-accessswitch.html'"></div>
</div>
</li>
</ul>
diff --git a/ecomp-portal-FE-common/client/app/views/catalog/information-box.tpl.html b/ecomp-portal-FE-common/client/app/views/catalog/information-box.tpl.html
index 8a848545..2802dac4 100644
--- a/ecomp-portal-FE-common/client/app/views/catalog/information-box.tpl.html
+++ b/ecomp-portal-FE-common/client/app/views/catalog/information-box.tpl.html
@@ -21,17 +21,9 @@
<div class="confirmation-message-wrap">
<div class="confirmation-message" >
<div>
- You do not have access to this application.
- See the
+ You do not have access to this application. To request access to an application, please visit the
<a href="" ng-click="confirmBox.goTo('root.getAccess', {appName: confirmBox.message.headerText})">
- Get Access page</a> and request access at MyLogins.
- <br><br>
- You may check this box if access is pending:
- <input type="checkbox"
- att-checkbox
- ng-model="confirmBox.message.pending"
- ng-change="confirmBox.storeSelection(confirmBox.message)"
- >
+ Get Access</a> page
</div>
</div>
diff --git a/ecomp-portal-FE-common/client/app/views/dashboard/dashboard.controller.js b/ecomp-portal-FE-common/client/app/views/dashboard/dashboard.controller.js
index 87558fa8..8481b5ed 100644
--- a/ecomp-portal-FE-common/client/app/views/dashboard/dashboard.controller.js
+++ b/ecomp-portal-FE-common/client/app/views/dashboard/dashboard.controller.js
@@ -20,506 +20,506 @@
'use strict';
function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError('Cannot call a class as a function');
- }
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError('Cannot call a class as a function');
+ }
}
(function() {
- var HTTP_PROTOCOL_RGX = /https?:\/\//;
-
- var DashboardCtrl = function DashboardCtrl(conf, applicationsService, $log,
- $window, userProfileService, $scope, $cookies, $timeout, $interval,
- $modal, $state, beReaderService, dashboardService, confirmBoxService,
- auditLogService,ngDialog, $compile, widgetsCatalogService) {
-
- this.conf = conf;
- var _this = this;
-
- _classCallCheck(this, DashboardCtrl);
-
- // activate spinner
- this.isLoading = true;
- this.isCommError = false;
- $scope.getUserAppsIsDone = false;
- this.userProfileService = userProfileService;
- $scope.demoNum = 1;
- $scope.event_content_show = false;
- $scope.widgetData = [];
- $scope.activateThis = function(ele){
- $compile(ele.contents())($scope);
- $scope.$apply();
- };
-
- $scope.editWidgetModalPopup = function(availableData, resourceType) {
- $scope.editData = JSON.stringify(availableData);
- $scope.availableDataTemp = $scope.availableData;
- ngDialog.open({
- templateUrl : 'app/views/dashboard/dashboard-widget-manage.html',
- controller : 'CommonWidgetController',
- resolve : {
- message : function message() {
- var message = {
- type : resourceType,
- availableData : $scope.editData
- };
- return message;
- }
- }
- }).closePromise.then(needUpdate => {
- if(resourceType=='NEWS'){
- $scope.updateNews();
- }else if(resourceType=='EVENTS'){
- $scope.updateEvents();
- }else if(resourceType=='IMPORTANTRESOURCES'){
- $scope.updateImportRes();
- }
- });
- };
-
- $scope.editWidgetParameters = function(widgetId) {
- let data = {
- widgetId: widgetId
+ var HTTP_PROTOCOL_RGX = /https?:\/\//;
+
+ var DashboardCtrl = function DashboardCtrl(conf, applicationsService, $log,
+ $window, userProfileService, $scope, $cookies, $timeout, $interval,
+ $modal, $state, beReaderService, dashboardService, confirmBoxService,
+ auditLogService, ngDialog, $compile, widgetsCatalogService) {
+
+ this.conf = conf;
+ var _this = this;
+
+ _classCallCheck(this, DashboardCtrl);
+
+ // activate spinner
+ this.isLoading = true;
+ this.isCommError = false;
+ $scope.getUserAppsIsDone = false;
+ this.userProfileService = userProfileService;
+ $scope.demoNum = 1;
+ $scope.event_content_show = false;
+ $scope.widgetData = [];
+ $scope.activateThis = function(ele) {
+ $compile(ele.contents())($scope);
+ $scope.$apply();
+ };
+
+ $scope.editWidgetModalPopup = function(availableData, resourceType) {
+ $scope.editData = JSON.stringify(availableData);
+ $scope.availableDataTemp = $scope.availableData;
+ ngDialog.open({
+ templateUrl: 'app/views/dashboard/dashboard-widget-manage.html',
+ controller: 'CommonWidgetController',
+ resolve: {
+ message: function message() {
+ var message = {
+ type: resourceType,
+ availableData: $scope.editData
+ };
+ return message;
+ }
+ }
+ }).closePromise.then(needUpdate => {
+ if (resourceType == 'NEWS') {
+ $scope.updateNews();
+ } else if (resourceType == 'EVENTS') {
+ $scope.updateEvents();
+ } else if (resourceType == 'IMPORTANTRESOURCES') {
+ $scope.updateImportRes();
+ }
+ });
+ };
+
+ $scope.editWidgetParameters = function(widgetId) {
+ let data = {
+ widgetId: widgetId
+ }
+ ngDialog.open({
+ templateUrl: 'app/views/dashboard/dashboard-widget-parameter-manage.html',
+ controller: 'WidgetParameterController',
+ data: data
+ }).closePromise.then(needUpdate => {
+
+ });
+ };
+
+ $scope.sort_options = [{
+ index: 0,
+ value: 'N',
+ title: 'Name'
+ },
+ {
+ index: 1,
+ value: 'L',
+ title: 'Last used'
+ },
+ {
+ index: 2,
+ value: 'F',
+ title: 'Most used'
+ },
+ {
+ index: 3,
+ value: 'M',
+ title: 'Manual'
+ }
+ ];
+
+ $scope.selectedSortTypeChanged = function(userAppSortTypePref) {
+ $scope.appsViewData = [];
+ $scope.appsView = [];
+
+ $scope.sort_type = userAppSortTypePref;
+
+ applicationsService
+ .getAppsOrderBySortPref(userAppSortTypePref)
+ .then(function(res) {
+ _this.apps = res;
+ $scope.applyPresentationDetailsToApps(_this.apps);
+ })
+ applicationsService
+ .saveAppsSortTypePreference($scope.selectedSortType)
+ .then(function(res) {
+ // Nothing to do
+ })
+
+ }
+ $scope.$watch('selectedSortType.value', (newVal, oldVal) => {
+ for (var i = 0; i < $scope.sort_options.length; i++) {
+ if ($scope.sort_options[i].value == newVal) {
+ $scope.selectedSortType = angular.copy($scope.sort_options[i]);;
+ }
}
- ngDialog.open({
- templateUrl : 'app/views/dashboard/dashboard-widget-parameter-manage.html',
- controller : 'WidgetParameterController',
- data: data
- }).closePromise.then(needUpdate => {
-
- });
- };
-
- $scope.sort_options = [
- {index: 0, value: 'N', title: 'Name'},
- {index: 1, value: 'L', title: 'Last used'},
- {index: 2, value: 'F', title: 'Most used'},
- {index: 3, value: 'M', title: 'Manual'}
- ];
-
- $scope.selectedSortTypeChanged = function(userAppSortTypePref) {
- $scope.appsViewData = [];
- $scope.appsView = [];
-
- $scope.sort_type = userAppSortTypePref;
-
- applicationsService
- .getAppsOrderBySortPref(userAppSortTypePref)
- .then(function(res) {
- _this.apps = res;
- $scope.applyPresentationDetailsToApps(_this.apps);
- })
- applicationsService
- .saveAppsSortTypePreference($scope.selectedSortType)
- .then(function(res) {
- // Nothing to do
- })
-
- }
- $scope.$watch('selectedSortType.value', (newVal, oldVal) => {
- for(var i=0;i<$scope.sort_options.length;i++){
- if($scope.sort_options[i].value==newVal){
- $scope.selectedSortType=angular.copy($scope.sort_options[i]);;
- }
- }
- });
-
- $scope.restoreSortSelected = function(){
- confirmBoxService.confirm("Restore the default size and position of all widgets?").then(
- function(confirmed){
- var checkConfirm = confirmed;
- if(checkConfirm === true){
- applicationsService
- .delWidgetsSortPref($scope.widgetsViewData).then(function(){
- $state.reload();
- });
- }
- });
- /* if(confirm('Restore the default size and position of all widgets?') == true)
- {
- applicationsService
- .delWidgetsSortPref($scope.widgetsViewData).then(function(){
- $state.reload();
- })
- }*/
-
- }
-
- $scope.applyPresentationDetailsToApps = function(appsReturned) {
- var rowNo = 0;
- for (var i = 0; i < _this.apps.length; i++) {
- $scope.appsView[i] = {
- sizeX : 1,
- sizeY : 1,
- headerText : '',
- subHeaderText : '',
- imageLink : '',
- order : '',
- url : '',
- appid: '',
- };
- $scope.appsView[i].headerText = appsReturned[i].name;
- $scope.appsView[i].subHeaderText = appsReturned[i].notes;
- let imgLnk = '';
- if (appsReturned[i].imageUrl)
- imgLnk = conf.api.appThumbnail.replace(':appId', appsReturned[i].id);
- //$log.debug('DashboardCtlr::applyPresn: imgLink = ' + imgLnk);
- $scope.appsView[i].imageLink = imgLnk;
- $scope.appsView[i].order = appsReturned[i].order;
- $scope.appsView[i].url = appsReturned[i].url;
- $scope.appsView[i].restrictedApp = appsReturned[i].restrictedApp;
- $scope.appsView[i].appid = appsReturned[i].id;
- }
- $scope.appsView[_this.apps.length] = {
- addRemoveApps : true,
- sizeX : 1,
- sizeY : 1,
- headerText : 'Add/Remove Applications',
- subHeaderText : '',
- imageLink : 'assets/images/cloud.png',
- order : '',
- restrictedApp : false,
- url : '',
- };
- if($scope.appsView.length>6){
- $(".dashboard-boarder").css({
- "height" : "400px"
- });
- }else{
- $(".dashboard-boarder").css({
- "height" : "210px"
- });
- }
-
- if ($scope.appsView != undefined
- && $scope.appsView != null
- && $scope.appsView.length > 0) {
- $scope.appsViewData = $scope.appsView;
- }
- }
-
-$scope.widgetsView = [];
-
- $scope.applyPresentationDetailsToWidgets = function(widgetsReturned){
- var rowNo = 0;
- for (var i = 0; i < widgetsReturned.length; i++) {
- $scope.widgetsView[i] = {
- sizeX : '',
- sizeY :'',
- headerText:'',
- widgetText:'',
- widgetIdentifier : '',
- url : '',
- widgetid: '',
- attrb:'',
- row:'',
- col:'',
- };
- $scope.widgetsView[i].widgetid = widgetsReturned[i].id;
- $scope.widgetsView[i].headerText = widgetsReturned[i].headerName;
- $scope.widgetsView[i].widgetText = widgetsReturned[i].name;
-
- if(widgetsReturned[i].headerName.toLowerCase() === 'news'){
- $scope.widgetsView[i].widgetIdentifier = 'NEWS';
- }
- else
- if(widgetsReturned[i].headerName.toLowerCase() === 'resources'){
- $scope.widgetsView[i].widgetIdentifier = 'IMPORTANTRESOURCES';
- }
- else
- if(widgetsReturned[i].headerName.toLowerCase() === 'events'){
- $scope.widgetsView[i].widgetIdentifier = 'EVENTS';
- }
-
- $scope.widgetsView[i].url = widgetsReturned[i].url;
- $scope.widgetsView[i].attrb = widgetsReturned[i].attrs;
- if(widgetsReturned[i].width === null){
- $scope.widgetsView[i].sizeX = 2;
- }else{
- $scope.widgetsView[i].sizeX = widgetsReturned[i].width;
- }
- if(widgetsReturned[i].height === null){
- $scope.widgetsView[i].sizeY = 2;
- }else{
- $scope.widgetsView[i].sizeY = widgetsReturned[i].height;
- }
- $scope.widgetsView[i].row = widgetsReturned[i].x;
- $scope.widgetsView[i].col = widgetsReturned[i].y;
- }
- if ($scope.widgetsView != undefined
- && $scope.widgetsView != null
- && $scope.widgetsView.length > 0) {
- $scope.widgetsViewData = $scope.widgetsView;
- }
- }
-
- applicationsService
- .getUserAppsSortTypePreference().then(function(res) {
- var resJson = {};
- resJson.value = res;
- if (resJson.value==="N" || resJson.value==="") {
- resJson.index = 0;
- resJson.title = 'Name';
- }else if (resJson.value==="L") {
- resJson.index = 1;
- resJson.title = 'Last used';
- }else if(resJson.value==="F"){
- resJson.index = 2;
- resJson.title = 'Most used';
- }else {
- resJson.index = 3;
- resJson.title = 'Manual';
- }
- $scope.selectedSortType = resJson;
- $scope.selectedSortTypeChanged(res);
-
-
- });
-
- $scope.widgetsList = [];
-
- let getUserWidgets = (loginName) => {
- var conf = this.conf;
- widgetsCatalogService.getUserWidgets(loginName).then(res => {
- if(!(res instanceof Array)){
- this.isCommError = true;
- return;
- }
- for(var i = 0; i < res.length; i++){
- var widget_id = res[i][0];
- var widget_name = res[i][1];
- let url = this.conf.api.widgetCommon + "/" + widget_id + "/framework.js";
- var header_name = widget_name;
- if(res[i][7] == 1){
- header_name = (widget_name.length > 9) ?widget_name.substring(0, 8) + '...' : widget_name;
- }
- if(res[i][4] === "S" || res[i][4] === null ){
- $scope.widgetsList.push({
- id: widget_id,
- headerName: header_name,
- name: widget_name,
- url: url,
- attrs: [{attr: 'data-' + res[i][0], value: ''}],
- x: res[i][3],
- y: res[i][5],
- height: res[i][6],
- width: res[i][7]
- });
- }
- var script = document
- .createElement('script');
- script.src = url;
- script.async = false;
- var entry = document
- .getElementsByTagName('script')[0];
- entry.parentNode
- .insertBefore(script, entry);
- }
- $scope.applyPresentationDetailsToWidgets($scope.widgetsList);
- }).catch(err => {
- $log.error('WidgetsHomeCtrl::getUserWidgets error: ' + err);
- }).finally(()=> {
-
});
- };
-
- userProfileService.getUserProfile().then(
- function(profile) {
- $scope.orgUserId = profile.orgUserId;
- getUserWidgets($scope.orgUserId);
- });
-
- /* Widget Gridster Section */
- $scope.newsGridsterItem = {
- sizeX : 1,
- sizeY : 1,
- headerText : 'News',
- subHeaderText : '',
- imageLink : '',
- order : '',
- url : ''
- };
-
- $scope.eventsGridsterItem = {
- sizeX : 1,
- sizeY : 1,
- headerText : 'Events',
- subHeaderText : '',
- imageLink : '',
- order : '',
- url : ''
- };
-
- $scope.impoResGridsterItem = {
- sizeX : 1,
- sizeY : 1,
- headerText : 'Resources',
- subHeaderText : '',
- imageLink : '',
- order : '',
- url : ''
- };
-
- this.gridsterAppOpts = {
- columns : 6,
- colWidth : 190,
- rowHeight : 190,
- margins : [ 20, 20 ],
- outerMargin : true,
- pushing : true,
- floating : true,
- swapping : true,
- resizable: {
- enabled: false,
- },
- draggable : {
- handle:'.icon-content-gridguide',
- stop: function stop() {
- $scope.defaultSortBy = function() {
- var resJson = {};
- resJson.value = 'M';
- resJson.index = 3;
- resJson.title = 'Manual';
- $scope.selectedSortType = resJson;
- applicationsService.saveAppsSortTypeManual($scope.appsViewData)
- applicationsService.saveAppsSortTypePreference($scope.selectedSortType)
- }
- $scope.defaultSortBy();
- }
- }
- };
-
- this.gridsterWidgetOpts = {
- columns : 6,
- colWidth : 190,
- rowHeight : 190,
- margins : [ 20, 20 ],
- outerMargin : true,
- pushing : true,
- floating : true,
- swapping : true,
- resizable: {
- enabled: true,
- stop: function stop(event, uiWidget, $element){
- if($element.sizeX == 1)
- $element.headerText = ($element.widgetText.length > 9) ? $element.widgetText.substring(0, 8) + '...' : $element.widgetText;
- if($element.sizeX >= 2)
- $element.headerText = $element.widgetText;
-
- applicationsService
- .saveWidgetsSortManual($scope.widgetsViewData)
-
- }
- },
- draggable : {
- handle:'.icon-content-gridguide',
- stop: function stop(){
- applicationsService
- .saveWidgetsSortManual($scope.widgetsViewData)
-
- }
- }
- };
-
- this.goToCatalog = function(item) {
- $state.go('root.appCatalog');
- }
-
- this.goToWidgetCatLog = function(item) {
- $state.go('root.widgetCatalog');
- }
-
- // navigate to application url in new tab
- this.goToPortal = function(item) {
- userProfileService.getUserRolesForApplication($scope.orgUserId,item.appid)
- .then(res=>{
- var count = 0;
- for(var i=0;i<res.length;i++){
- if(!res[i].isApplied)
- {
- count++;
- }
- }
- if((count>0 && res.length == count)||res.length==0)
- {
- confirmBoxService.showInformation('You have no roles assigned to this application to access.').then(isConfirmed => {});
-
- }
- else{
- if (!item.url) {
- $log.error('No URL found for this application, doing nothing!');
- return;
- }
- if (item.restrictedApp) {
- // Link-based apps open in their own browser tab
- $window.open(item.url, '_blank');
- } else {
- // cache control so browsers load app page every time
- var ccParam = 'cc=' + new Date().getTime();
- var urlParts = item.url.split('#');
- var appUrl = null;
- if (urlParts.length < 2) {
- // no #
- let urlLastChar = item.url.charAt(item.url.length - 1);
- if (item.url.includes("?"))
- appUrl = (urlLastChar === '&' ? item.url + ccParam : item.url + '&' + ccParam);
- else
- appUrl = item.url + '?' + ccParam;
- } else {
- // has #
- let urlLastChar = urlParts[0].charAt(urlParts[0].length - 1);
- if (item.url.includes("?"))
- appUrl = (urlLastChar === '&' ? urlParts[0] + ccParam + '#' + urlParts[1] : urlParts[0] + '&' + ccParam + '#' + urlParts[1]);
- else
- appUrl = urlParts[0] + '?' + ccParam + "#" + urlParts[1];
- }
- // $log.debug('DashboardCtrlr::goToPortal: opening tab with URL
- // ' + appUrl);
- var tabContent = {
- id: new Date(),
- title: item.headerText,
- url: appUrl,
- appId: item.appId
- };
- $cookies.putObject('addTab', tabContent);
- }
-
- }
- });
-
-
-
-
- };
-
- this.auditLog = function(app) {
- console.log(app);
- auditLogService.storeAudit(app.appid,'app',app.url);
- };
-
- if (getParameterByName('noUserError') != null) {
- if (getParameterByName('noUserError') == "Show") {
- $("#errorInfo").show();
- }
- }
- };
-
- DashboardCtrl.$inject = [ 'conf', 'applicationsService', '$log', '$window',
- 'userProfileService', '$scope', '$cookies', '$timeout', '$interval',
- '$modal', '$state', 'beReaderService', 'dashboardService', 'confirmBoxService',
- 'auditLogService', 'ngDialog', '$compile', 'widgetsCatalogService' ];
- angular.module('ecompApp').controller('DashboardCtrl', DashboardCtrl);
+
+ $scope.restoreSortSelected = function() {
+ confirmBoxService.confirm("Restore the default size and position of all widgets?").then(
+ function(confirmed) {
+ var checkConfirm = confirmed;
+ if (checkConfirm === true) {
+ applicationsService
+ .delWidgetsSortPref($scope.widgetsViewData).then(function() {
+ $state.reload();
+ });
+ }
+ });
+ /*
+ * if(confirm('Restore the default size and position of all widgets?') ==
+ * true) { applicationsService
+ * .delWidgetsSortPref($scope.widgetsViewData).then(function(){
+ * $state.reload(); }) }
+ */
+
+ }
+
+ $scope.applyPresentationDetailsToApps = function(appsReturned) {
+ var rowNo = 0;
+ for (var i = 0; i < _this.apps.length; i++) {
+ $scope.appsView[i] = {
+ sizeX: 1,
+ sizeY: 1,
+ headerText: '',
+ subHeaderText: '',
+ imageLink: '',
+ order: '',
+ url: '',
+ appid: '',
+ };
+ $scope.appsView[i].headerText = appsReturned[i].name;
+ $scope.appsView[i].subHeaderText = appsReturned[i].notes;
+ let imgLnk = '';
+ if (appsReturned[i].imageUrl)
+ imgLnk = conf.api.appThumbnail.replace(':appId', appsReturned[i].id);
+ // $log.debug('DashboardCtlr::applyPresn: imgLink = ' + imgLnk);
+ $scope.appsView[i].imageLink = imgLnk;
+ $scope.appsView[i].order = appsReturned[i].order;
+ $scope.appsView[i].url = appsReturned[i].url;
+ $scope.appsView[i].restrictedApp = appsReturned[i].restrictedApp;
+ $scope.appsView[i].appid = appsReturned[i].id;
+ }
+ $scope.appsView[_this.apps.length] = {
+ addRemoveApps: true,
+ sizeX: 1,
+ sizeY: 1,
+ headerText: 'Add/Remove Applications',
+ subHeaderText: '',
+ imageLink: 'assets/images/cloud.png',
+ order: '',
+ restrictedApp: false,
+ url: '',
+ };
+ if ($scope.appsView.length > 6) {
+ $(".dashboard-boarder").css({
+ "height": "400px"
+ });
+ } else {
+ $(".dashboard-boarder").css({
+ "height": "210px"
+ });
+ }
+
+ if ($scope.appsView != undefined &&
+ $scope.appsView != null &&
+ $scope.appsView.length > 0) {
+ $scope.appsViewData = $scope.appsView;
+ }
+ }
+
+ $scope.widgetsView = [];
+
+ $scope.applyPresentationDetailsToWidgets = function(widgetsReturned) {
+ var rowNo = 0;
+ for (var i = 0; i < widgetsReturned.length; i++) {
+ $scope.widgetsView[i] = {
+ sizeX: '',
+ sizeY: '',
+ headerText: '',
+ widgetText: '',
+ widgetIdentifier: '',
+ url: '',
+ widgetid: '',
+ attrb: '',
+ row: '',
+ col: '',
+ };
+ $scope.widgetsView[i].widgetid = widgetsReturned[i].id;
+ $scope.widgetsView[i].headerText = widgetsReturned[i].headerName;
+ $scope.widgetsView[i].widgetText = widgetsReturned[i].name;
+
+ if (widgetsReturned[i].headerName.toLowerCase() === 'news') {
+ $scope.widgetsView[i].widgetIdentifier = 'NEWS';
+ } else
+ if (widgetsReturned[i].headerName.toLowerCase() === 'resources') {
+ $scope.widgetsView[i].widgetIdentifier = 'IMPORTANTRESOURCES';
+ } else
+ if (widgetsReturned[i].headerName.toLowerCase() === 'events') {
+ $scope.widgetsView[i].widgetIdentifier = 'EVENTS';
+ }
+
+ $scope.widgetsView[i].url = widgetsReturned[i].url;
+ $scope.widgetsView[i].attrb = widgetsReturned[i].attrs;
+ if (widgetsReturned[i].width === null) {
+ $scope.widgetsView[i].sizeX = 2;
+ } else {
+ $scope.widgetsView[i].sizeX = widgetsReturned[i].width;
+ }
+ if (widgetsReturned[i].height === null) {
+ $scope.widgetsView[i].sizeY = 2;
+ } else {
+ $scope.widgetsView[i].sizeY = widgetsReturned[i].height;
+ }
+ $scope.widgetsView[i].row = widgetsReturned[i].x;
+ $scope.widgetsView[i].col = widgetsReturned[i].y;
+ }
+ if ($scope.widgetsView != undefined &&
+ $scope.widgetsView != null &&
+ $scope.widgetsView.length > 0) {
+ $scope.widgetsViewData = $scope.widgetsView;
+ }
+ }
+
+ applicationsService
+ .getUserAppsSortTypePreference().then(function(res) {
+ var resJson = {};
+ resJson.value = res;
+ if (resJson.value === "N" || resJson.value === "") {
+ resJson.index = 0;
+ resJson.title = 'Name';
+ } else if (resJson.value === "L") {
+ resJson.index = 1;
+ resJson.title = 'Last used';
+ } else if (resJson.value === "F") {
+ resJson.index = 2;
+ resJson.title = 'Most used';
+ } else {
+ resJson.index = 3;
+ resJson.title = 'Manual';
+ }
+ $scope.selectedSortType = resJson;
+ $scope.selectedSortTypeChanged(res);
+
+
+ });
+
+ $scope.widgetsList = [];
+
+ let getUserWidgets = (loginName) => {
+ var conf = this.conf;
+ widgetsCatalogService.getUserWidgets(loginName).then(res => {
+ if (!(res instanceof Array)) {
+ this.isCommError = true;
+ return;
+ }
+ for (var i = 0; i < res.length; i++) {
+ var widget_id = res[i][0];
+ var widget_name = res[i][1];
+ let url = this.conf.api.widgetCommon + "/" + widget_id + "/framework.js";
+ var header_name = widget_name;
+ if (res[i][7] == 1) {
+ header_name = (widget_name.length > 9) ? widget_name.substring(0, 8) + '...' : widget_name;
+ }
+ if (res[i][4] === "S" || res[i][4] === null) {
+ $scope.widgetsList.push({
+ id: widget_id,
+ headerName: header_name,
+ name: widget_name,
+ url: url,
+ attrs: [{
+ attr: 'data-' + res[i][0],
+ value: ''
+ }],
+ x: res[i][3],
+ y: res[i][5],
+ height: res[i][6],
+ width: res[i][7]
+ });
+ }
+ var script = document
+ .createElement('script');
+ script.src = url;
+ script.async = false;
+ var entry = document
+ .getElementsByTagName('script')[0];
+ entry.parentNode
+ .insertBefore(script, entry);
+ }
+ $scope.applyPresentationDetailsToWidgets($scope.widgetsList);
+ }).catch(err => {
+ $log.error('WidgetsHomeCtrl::getUserWidgets error: ' + err);
+ }).finally(() => {
+
+ });
+ };
+
+ userProfileService.getUserProfile().then(
+ function(profile) {
+ $scope.orgUserId = profile.orgUserId;
+ getUserWidgets($scope.orgUserId);
+ });
+
+ /* Widget Gridster Section */
+ $scope.newsGridsterItem = {
+ sizeX: 1,
+ sizeY: 1,
+ headerText: 'News',
+ subHeaderText: '',
+ imageLink: '',
+ order: '',
+ url: ''
+ };
+
+ $scope.eventsGridsterItem = {
+ sizeX: 1,
+ sizeY: 1,
+ headerText: 'Events',
+ subHeaderText: '',
+ imageLink: '',
+ order: '',
+ url: ''
+ };
+
+ $scope.impoResGridsterItem = {
+ sizeX: 1,
+ sizeY: 1,
+ headerText: 'Resources',
+ subHeaderText: '',
+ imageLink: '',
+ order: '',
+ url: ''
+ };
+
+ this.gridsterAppOpts = {
+ columns: 6,
+ colWidth: 190,
+ rowHeight: 190,
+ margins: [20, 20],
+ outerMargin: true,
+ pushing: true,
+ floating: true,
+ swapping: true,
+ resizable: {
+ enabled: false,
+ },
+ draggable: {
+ handle: '.icon-content-gridguide',
+ stop: function stop() {
+ $scope.defaultSortBy = function() {
+ var resJson = {};
+ resJson.value = 'M';
+ resJson.index = 3;
+ resJson.title = 'Manual';
+ $scope.selectedSortType = resJson;
+ applicationsService.saveAppsSortTypeManual($scope.appsViewData)
+ applicationsService.saveAppsSortTypePreference($scope.selectedSortType)
+ }
+ $scope.defaultSortBy();
+ }
+ }
+ };
+
+ this.gridsterWidgetOpts = {
+ columns: 6,
+ colWidth: 190,
+ rowHeight: 190,
+ margins: [20, 20],
+ outerMargin: true,
+ pushing: true,
+ floating: true,
+ swapping: true,
+ resizable: {
+ enabled: true,
+ stop: function stop(event, uiWidget, $element) {
+ if ($element.sizeX == 1)
+ $element.headerText = ($element.widgetText.length > 9) ? $element.widgetText.substring(0, 8) + '...' : $element.widgetText;
+ if ($element.sizeX >= 2)
+ $element.headerText = $element.widgetText;
+
+ applicationsService
+ .saveWidgetsSortManual($scope.widgetsViewData)
+
+ }
+ },
+ draggable: {
+ handle: '.icon-content-gridguide',
+ stop: function stop() {
+ applicationsService
+ .saveWidgetsSortManual($scope.widgetsViewData)
+
+ }
+ }
+ };
+
+ this.goToCatalog = function(item) {
+ $state.go('root.appCatalog');
+ }
+
+ this.goToWidgetCatLog = function(item) {
+ $state.go('root.widgetCatalog');
+ }
+
+ // navigate to application url in new tab
+ this.goToPortal = function(item) {
+
+ if (!item.url) {
+ $log.error('No URL found for this application, doing nothing!');
+ return;
+ }
+ if (item.restrictedApp) {
+ // Link-based apps open in their own browser tab
+ $window.open(item.url, '_blank');
+ } else {
+ // cache control so browsers load app page every
+ // time
+ var ccParam = 'cc=' + new Date().getTime();
+ var urlParts = item.url.split('#');
+ var appUrl = null;
+ if (urlParts.length < 2) {
+ // no #
+ let urlLastChar = item.url.charAt(item.url.length - 1);
+ if (item.url.includes("?"))
+ appUrl = (urlLastChar === '&' ? item.url + ccParam : item.url + '&' + ccParam);
+ else
+ appUrl = item.url + '?' + ccParam;
+ } else {
+ // has #
+ let urlLastChar = urlParts[0].charAt(urlParts[0].length - 1);
+ if (item.url.includes("?"))
+ appUrl = (urlLastChar === '&' ? urlParts[0] + ccParam + '#' + urlParts[1] : urlParts[0] + '&' + ccParam + '#' + urlParts[1]);
+ else
+ appUrl = urlParts[0] + '?' + ccParam + "#" + urlParts[1];
+ }
+ // $log.debug('DashboardCtrlr::goToPortal: opening
+ // tab with URL
+ // ' + appUrl);
+ var tabContent = {
+ id: new Date(),
+ title: item.headerText,
+ url: appUrl,
+ appId: item.appId
+ };
+ $cookies.putObject('addTab', tabContent);
+ }
+
+
+ };
+
+ this.auditLog = function(app) {
+ console.log(app);
+ auditLogService.storeAudit(app.appid, 'app', app.url);
+ };
+
+ if (getParameterByName('noUserError') != null) {
+ if (getParameterByName('noUserError') == "Show") {
+ $("#errorInfo").show();
+ }
+ }
+ };
+
+ DashboardCtrl.$inject = ['conf', 'applicationsService', '$log', '$window',
+ 'userProfileService', '$scope', '$cookies', '$timeout', '$interval',
+ '$modal', '$state', 'beReaderService', 'dashboardService', 'confirmBoxService',
+ 'auditLogService', 'ngDialog', '$compile', 'widgetsCatalogService'
+ ];
+ angular.module('ecompApp').controller('DashboardCtrl', DashboardCtrl);
})();
function getParameterByName(name, url) {
- if (!url)
- url = window.location.href;
- name = name.replace(/[\[\]]/g, "\\$&");
- var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), results = regex
- .exec(url);
- if (!results)
- return '';
- if (!results[2])
- return '';
- return results[2].replace(/\+/g, " ");
-}
+ if (!url)
+ url = window.location.href;
+ name = name.replace(/[\[\]]/g, "\\$&");
+ var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
+ results = regex
+ .exec(url);
+ if (!results)
+ return '';
+ if (!results[2])
+ return '';
+ return results[2].replace(/\+/g, " ");
+} \ No newline at end of file
diff --git a/ecomp-portal-FE-common/client/app/views/header/header.controller.js b/ecomp-portal-FE-common/client/app/views/header/header.controller.js
index 33cb8454..2eba057c 100644
--- a/ecomp-portal-FE-common/client/app/views/header/header.controller.js
+++ b/ecomp-portal-FE-common/client/app/views/header/header.controller.js
@@ -20,7 +20,7 @@
'use strict';
(function () {
class HeaderCtrl {
- constructor($log, $window, userProfileService, menusService, $scope, ECOMP_URL_REGEX, $cookies, $state,auditLogService,notificationService,recommendationService,ngDialog) {
+ constructor($log, $window, userProfileService, menusService, $scope, ECOMP_URL_REGEX, $cookies, $state,auditLogService,notificationService,ngDialog) {
this.firstName = '';
this.lastName = '';
this.$log = $log;
@@ -33,7 +33,6 @@
$scope.emptyFavorites = false;
$scope.favoritesWindow = false;
$scope.notificationCount=0;
- $scope.recommendationCount=0;
$scope.showNotification = true;
$scope.hideMenus = false;
@@ -47,7 +46,6 @@
};
$scope.megaMenuDataObject =[];
$scope.notificationCount= notificationService.notificationCount;
- $scope.recommendationCount= recommendationService.recommendationCount;
this.isLoading = true;
this.ECOMP_URL_REGEX = ECOMP_URL_REGEX;
@@ -474,85 +472,10 @@
}
}
- class RecommendationCtrl{
- constructor($log, $scope, $cookies, $timeout, sessionService,recommendationService,notificationService,$interval,ngDialog) {
- $scope.recommendations=[];
- var intervalPromise = null;
- $scope.recommendationCount= recommendationService.recommendationCount;
- console.log("$",$);
- $scope.getRecommendations = function(){
- $("#recommendation-bulb").removeClass('icon-misc-bulbL').addClass('icon-misc-bulb')
- recommendationService.getRecommendations()
-
- .then(res=> {
- $("#recommendation-bulb").removeClass('icon-misc-bulb').addClass('icon-misc-bulbL')
- recommendationService.decrementRefreshCount();
- var count = recommendationService.getRefreshCount();
- if ( res.data==null) {
- $log.error('RecommendationCtrl::update Recommendation: failed to get recommendation');
- if (intervalPromise != null)
- $interval.cancel(intervalPromise);
- } else if(count>=0){
- if (intervalPromise != null)
- $interval.cancel(intervalPromise);
- } else {
- $scope.recommendations = [];
- recommendationService.setRecommendationCount(res.data.recommendations.length);
- for(var i=0;i<res.data.recommendations.length;i++){
- var data = res.data.recommendations[i];
- var recommendations ={
-
- recommendation:data
- };
- $scope.recommendations.push(recommendations);
- }
- }
- }).catch(err=> {
- $log.error('RecommendationCtrl::gatRecommendations: caught exception: ' + err);
- if (intervalPromise != null)
- $interval.cancel(intervalPromise);
- });
- }
- $scope.getRecommendations();
-
- function updateRecommendations() {
- $scope.getRecommendations();
- }
-
- notificationService.getNotificationRate().then(res=> {
- if (res == null || res.response == null) {
- $log.error('NotificationCtrl: failed to notification update rate or duration, check system.properties file.');
- } else {
- var rate = parseInt(res.response.updateRate);
- var duration = parseInt(res.response.updateDuration);
- notificationService.setMaxRefreshCount(parseInt(duration/rate)+1);
- notificationService.setRefreshCount(notificationService.maxCount);
- if (rate != NaN && duration != NaN) {
- $scope.updateRate=rate;
- setInterval(function(){$scope.getRecommendations();},rate);
-
- }
- }
- }).catch(err=> {
- $log.error('NotificationCtrl: getNotificationRate() failed: ' + err);
- });
- $scope.deleteRecommendation = function(index){
- if ($scope.recommendations[index] == null || $scope.recommendations[index] == '') {
- $log.error('RecommendationCtrl: failed to delete Recommendation.');
- return;
- }
- $scope.recommendations.splice(index,1);
- recommendationService.setRecommendationCount($scope.recommendations.length);
- }
- }
- }
NotificationCtrl.$inject = ['$log', '$scope', '$cookies', '$timeout', 'sessionService','notificationService','$interval','ngDialog'];
- RecommendationCtrl.$inject = ['$log', '$scope', '$cookies', '$timeout', 'sessionService','recommendationService','notificationService','$interval','ngDialog'];
LoginSnippetCtrl.$inject = ['$log', '$scope', '$cookies', '$timeout','userProfileService', 'sessionService'];
- HeaderCtrl.$inject = ['$log', '$window', 'userProfileService', 'menusService', '$scope', 'ECOMP_URL_REGEX','$cookies','$state','auditLogService','notificationService','recommendationService','ngDialog'];
+ HeaderCtrl.$inject = ['$log', '$window', 'userProfileService', 'menusService', '$scope', 'ECOMP_URL_REGEX','$cookies','$state','auditLogService','notificationService','ngDialog'];
angular.module('ecompApp').controller('HeaderCtrl', HeaderCtrl);
angular.module('ecompApp').controller('loginSnippetCtrl', LoginSnippetCtrl);
angular.module('ecompApp').controller('notificationCtrl', NotificationCtrl);
- angular.module('ecompApp').controller('recommendationCtrl', RecommendationCtrl);
-
})();
diff --git a/ecomp-portal-FE-common/client/app/views/header/header.tpl.html b/ecomp-portal-FE-common/client/app/views/header/header.tpl.html
index 3d1d3305..ea7273b9 100644
--- a/ecomp-portal-FE-common/client/app/views/header/header.tpl.html
+++ b/ecomp-portal-FE-common/client/app/views/header/header.tpl.html
@@ -267,63 +267,10 @@
</b2b-flyout-content>
</b2b-flyout>
</li>
-
- <!-- Recommendation Bulb -->
-
- <li class="header__item recommendation" aria-haspopup="true" class="recommendation-li">
- <b2b-flyout>
- <div b2b-flyout-toggler class="recommendation-div">
- <div class="recommendations-count" ng-hide="recommendationCount.count==0" ng-bind="recommendationCount.count"></div>
-<div class="icon-misc-bulbL megamenu-recommendation-overrides" id="recommendation-bulb" tabindex="0" b2b-accessibility-click="13,32" aria-label="recommendation" aria-haspopup="true" aria-expanded="{{flyoutOpened}}" style="font-size: 22px;"role="button"></div> </div>
- <b2b-flyout-content horizontal-placement="center" vertical-placement="below">
- <div class="recommendation-content" ng-controller="recommendationCtrl" >
- <div class="ng-scope">
- <div id="recommendation" class="notificationBox ">
- <!-- <div align ="right">
- <a ui-sref="root.recommendationsHistory" style="font-size: 14px"> View All Recent Notifications </a>
- </div> -->
- <div class="notification-header">
- <div style="float:left;">
- <p class="notification-heading">Recommendations</p>
- </div>
- <div style="clear:both;"></div>
- </div>
- <div ng-show="recommendations.length==0">
- <div class="notification-main">
- <div style="height:113px;">
- <div align="center" class="icon-information notification-info-icon"></div>
- </div>
- <div>
- <p class="notification-text">No New Recommendations</p>
- </div>
-
- </div>
- </div>
- <div class="notification-main" ng-show="recommendations.length>0">
- <ul class="notifications-list">
- <li class="item" data-id="5" ng-repeat="item in recommendations">
- <div class="icon">
- <span class="normal" ng-show="item.recommendation"/>
- </div>
- <div class="details">
-
- <span class="message-body" ng-bind="item.recommendation"></span>
-
-
- </div>
- <button type="button" ng-click="deleteRecommendation($index)" class="button-default button-dismiss js-dismiss">x</button>
- </li>
- </ul>
- </div>
- <div class="notification-footer">
- <div class="notification-links">
- <div style="clear:both;"></div>
- </div>
- </div>
- </div>
- </b2b-flyout-content>
- </b2b-flyout>
- </li>
+ <li class="header__item recommendation" aria-haspopup="true"
+ class="recommendation-li">
+ <div ng-include class="recommendation-detail-extension" src="'app/views/headerRecommendation/headerRecommendations.tpl.html'"></div>
+ </li>
</div>
</ul>
</header>
diff --git a/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.controller.js b/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.controller.js
index c93d8643..0c43c1fa 100644
--- a/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.controller.js
+++ b/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.controller.js
@@ -20,36 +20,42 @@
'use strict';
(function () {
class GetAccessCtrl {
- constructor($log, $scope, $stateParams, getAccessService, userProfileService, ExternalRequestAccessService, applicationsService, ngDialog) {
+ constructor($log, $scope, $stateParams, filterFilter, getAccessService, userProfileService, ExternalRequestAccessService, applicationsService, ngDialog) {
// $log.debug('GetAccessCtrl: appService param is: ' + applicationsService.goGetAccessAppName);
var resultAccessValue = null;
- var externalRequest = true;
-
+
$scope.openAppRoleModal = (itemData) => {
if(resultAccessValue){
let data = null;
data = {
dialogState: 2,
selectedUser:{
- attuid: $scope.attuid,
+ orgUserId: $scope.orgUserId,
firstName: $scope.firstName,
lastName: $scope.lastName,
headerText: itemData.app_name,
- extReqValue : externalRequest
}
}
ngDialog.open({
- templateUrl: 'app/views/catalog/add-catalog-dialogs/new-catalog.modal.html',
- controller: 'NewCatalogModalCtrl',
+ templateUrl: 'app/views/catalog/request-access-catalog-dialogs/request-access-catalog.modal.html',
+ controller: 'ExternalRequestAccessCtrl',
controllerAs: 'userInfo',
data: data
});
}
}
+ $scope.$watch('access.searchString', function (searchKey) {
+ var search = searchKey;
+ this.totalPage = filterFilter($scope.access.appTable, search);
+ var resultLen = this.totalPage.length;
+ $scope.access.totalPage = Math.ceil(resultLen/$scope.access.viewPerPage);
+ $scope.access.currentPage = 1;
+ });
+
userProfileService.getUserProfile().then(
function(profile) {
- $scope.attuid = profile.orgUserId;
+ $scope.orgUserId = profile.orgUserId;
$scope.firstName = profile.firstName;
$scope.lastName = profile.lastName;
});
@@ -120,6 +126,6 @@
init();
}
}
- GetAccessCtrl.$inject = ['$log', '$scope', '$stateParams', 'getAccessService', 'userProfileService', 'ExternalRequestAccessService','applicationsService', 'ngDialog'];
+ GetAccessCtrl.$inject = ['$log', '$scope', '$stateParams', 'filterFilter', 'getAccessService', 'userProfileService', 'ExternalRequestAccessService','applicationsService', 'ngDialog'];
angular.module('ecompApp').controller('GetAccessCtrl', GetAccessCtrl);
})();
diff --git a/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.tpl.html b/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.tpl.html
index 08ccbf48..ef0c2428 100644
--- a/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.tpl.html
+++ b/ecomp-portal-FE-common/client/app/views/support/get-access/get-access.tpl.html
@@ -50,12 +50,11 @@
</tr>
</thead>
<tbody b2b-table-row type="body"
- row-repeat="rowData in access.appTable | filter:access.searchString | limitTo:access.viewPerPage:access.startIndex | orderBy:'ecomp_function'" track-by="$index">
+ row-repeat="rowData in access.appTable | filter:access.searchString | startFrom:(access.currentPage-1)*access.viewPerPage | limitTo:access.viewPerPage | orderBy:'ecomp_function'" track-by="$index">
<tr id="tr-rowData" ng-click="openAppRoleModal(rowData)">
<td b2b-table-body>
<div id="access-page-function"
ng-if="rowData.ecomp_function !== 'Ecomp Function Not Available'"
- ng-show="$index == 0 || access.appTable[$index-1].ecomp_function != rowData.ecomp_function"
ng-bind="rowData.ecomp_function"></div>
<div id="access-page-function"
ng-if="rowData.ecomp_function === 'Ecomp Function Not Available'"
@@ -63,7 +62,6 @@
</td>
<td b2b-table-body>
<div id="access-page-appName"
- ng-show="$index == 0 || access.appTable[$index-1].app_name != rowData.app_name"
ng-bind="rowData.app_name"></div>
</td>
<td b2b-table-body>
diff --git a/ecomp-portal-FE-common/client/app/views/users/new-user-dialogs/bulk-user.controller.js b/ecomp-portal-FE-common/client/app/views/users/new-user-dialogs/bulk-user.controller.js
index e73fe290..8c9420d4 100644
--- a/ecomp-portal-FE-common/client/app/views/users/new-user-dialogs/bulk-user.controller.js
+++ b/ecomp-portal-FE-common/client/app/views/users/new-user-dialogs/bulk-user.controller.js
@@ -340,7 +340,7 @@
if (prevRow == null || prevRow.orgUserId.toLowerCase() !== uploadRow.orgUserId.toLowerCase()) {
if (debug)
$log.debug('BulkUserModalCtrl::buildAppRoleChecks: create request for orgUserId ' + uploadRow.orgUserId);
- let appPromise = usersService.getUserAppRoles(appId, uploadRow.orgUserId).promise().then( (userAppRolesResult) => {
+ let appPromise = usersService.getUserAppRoles(appId, uploadRow.orgUserId,true).promise().then( (userAppRolesResult) => {
// Reply for unknown user has all defined roles with isApplied=false on each.
if (typeof userAppRolesResult[0] !== "undefined") {
if (debug)
diff --git a/ecomp-portal-FE-common/client/app/views/widget-onboarding/widget-onboarding.controller.js b/ecomp-portal-FE-common/client/app/views/widget-onboarding/widget-onboarding.controller.js
index 661c63a3..0e7fd9fb 100644
--- a/ecomp-portal-FE-common/client/app/views/widget-onboarding/widget-onboarding.controller.js
+++ b/ecomp-portal-FE-common/client/app/views/widget-onboarding/widget-onboarding.controller.js
@@ -189,9 +189,16 @@
}
var a = document.createElement('a');
var blob = new Blob([data], {type: 'application/octet-stream'});
- a.href = URL.createObjectURL(blob);
+ var url = window.URL.createObjectURL(blob);
+ a.href = url;
a.download = filename;
+ document.body.appendChild(a);
a.click();
+
+ setTimeout(function(){
+ document.body.removeChild(a);
+ window.URL.revokeObjectURL(url);
+ }, 100);
});
};
diff --git a/ecomp-portal-FE-os/client/src/directives/search-users/search-users.less b/ecomp-portal-FE-os/client/src/directives/search-users/search-users.less
index 2fb1b27e..32ea9caa 100644
--- a/ecomp-portal-FE-os/client/src/directives/search-users/search-users.less
+++ b/ecomp-portal-FE-os/client/src/directives/search-users/search-users.less
@@ -25,6 +25,10 @@
}
+ .user:focus {
+ outline: -webkit-focus-ring-color auto 5px;
+ background-color:white !important;
+ }
.add-user-section{
margin-top:0px;
margin-left:10px;
diff --git a/ecomp-portal-FE-os/client/src/services/recommendation/recommendation.service.js b/ecomp-portal-FE-os/client/src/services/recommendation/recommendation.service.js
new file mode 100644
index 00000000..4df4e394
--- /dev/null
+++ b/ecomp-portal-FE-os/client/src/services/recommendation/recommendation.service.js
@@ -0,0 +1,24 @@
+/*-
+ * ================================================================================
+ * 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 wl849v on 12/14/2016.
+ */
+
+/*As Recommendation code belongs to internal use Just kept an empty file in order to avoid 404 errors in the browser console */ \ No newline at end of file
diff --git a/ecomp-portal-FE-os/client/src/services/userProfile/userProfile.service.js b/ecomp-portal-FE-os/client/src/services/userProfile/userProfile.service.js
index dc0022ac..2cc7c329 100644
--- a/ecomp-portal-FE-os/client/src/services/userProfile/userProfile.service.js
+++ b/ecomp-portal-FE-os/client/src/services/userProfile/userProfile.service.js
@@ -195,7 +195,7 @@
return deferred.promise;
}
-
+
}
UserProfileService.$inject = ['$q', '$log', '$http', 'conf', 'uuid4', 'utilsService'];
angular.module('ecompApp').service('userProfileService', UserProfileService)
diff --git a/ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.controller.js b/ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.controller.js
deleted file mode 100644
index c2eda6ed..00000000
--- a/ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.controller.js
+++ /dev/null
@@ -1,218 +0,0 @@
-/*-
- * ================================================================================
- * 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 NewCatalogModalCtrl {
- constructor($scope, $log, usersService, catalogService, applicationsService, confirmBoxService) {
- let init = () => {
- //$log.info('NewUserModalCtrl::init');
- this.isSaving = false;
- this.adminApps =[];
- this.appRoles = [];
- $scope.userAppRoles = [];
- $scope.titleText = "Request for Access in MyLogins:";
- $scope.title ="Request is pending in MyLogins for the following Roles";
- this.isGettingAdminApps = false;
- if($scope.ngDialogData && $scope.ngDialogData.selectedUser && $scope.ngDialogData.dialogState){
- this.selectedUser = $scope.ngDialogData.selectedUser;
- this.dialogState = $scope.ngDialogData.dialogState;
- this.isShowBack = false;
- if(this.dialogState === 2){
- this.getUserAppsRoles();
- }
- }
- };
-
- this.appChanged = (index) => {
- let myApp = this.adminApps[index];
- //$log.debug('NewUserModalCtrl::appChanged: index: ', index, '; app id: ', myApp.id, 'app name: ',myApp.name);
- myApp.isChanged = true;
- this.anyChanges = true;
- }
-
- this.deleteApp = (app) => {
- let appMessage = this.selectedUser.firstName + ' ' + this.selectedUser.lastName;
- confirmBoxService.deleteItem(appMessage).then(isConfirmed => {
- if(isConfirmed){
- this.anyChanges = true;
- app.isChanged = true;
- app.isDeleted = true; // use this to hide the app in the display
- app.appRoles.forEach(function(role){
- role.isApplied = false;
- });
- }
- }).catch(err => {
- $log.error('NewUserModalCtrl::deleteApp error: ',err);
- confirmBoxService.showInformation('There was a problem deleting the the applications. ' +
- 'Please try again later. Error: ' + err.status).then(isConfirmed => {});
- });
- };
-
- this.getUserAppsRoles = () => {
-
- //$log.debug('NewUserModalCtrl::getUserAppsRoles: about to call getAdminAppsSimpler');
- this.isGettingAdminApps = true;
- catalogService.getAppCatalog().then((apps) => {
- //$log.debug('NewUserModalCtrl::getUserAppsRoles: beginning of then for getAdminAppsSimpler');
-
- this.isGettingAdminApps = false;
- if (!apps || !apps.length) {
- $log.error('NewUserModalCtrl::getUserApps error: no admin apps found');
- return null;
- }
- //$log.debug('NewUserModalCtrl::getUserAppsRoles: then for getAdminAppsSimpler: step 2');
- //$log.debug('NewUserModalCtrl::getUserAppsRoles: admin apps: ', apps);
-
- this.dialogState = 2;
- this.isLoading = true;
- this.adminApps = apps;
-
- catalogService.getuserAppRolesCatalog(this.selectedUser.headerText).then(
- function(result) {
- // $log.debug('CatalogCtrl:storeSelection result is ', result);
-
- $scope.userAppRoles = result;
- $scope.displyUserAppCatalogRoles = true;
- if(result.length === 1 && result[0].requestedRoleId === null)
- {
- $scope.title= "Removal Request is pending in MyLogins";
- }
-
- if($scope.userAppRoles.length==0)
- {
- $scope.displyUserAppCatalogRoles = false;
- }
- });
- apps.forEach(app => {
- if(app.name === this.selectedUser.headerText){
- //$log.debug('NewUserModalCtrl::getUserAppsRoles: app: id: ', app.id, 'name: ',app.name);
- // Keep track of which app has changed, so we know which apps to update using a BE API
- app.isChanged = false;
- // Each of these specifies a state, which corresponds to a different message and style that gets displayed
- app.isLoading = true;
- app.isError = false;
- app.isDeleted = false;
- app.printNoChanges = false;
- app.isUpdating = false;
- app.isErrorUpdating = false;
- app.isDoneUpdating = false;
- app.errorMessage = "";
- usersService.getUserAppRoles(app.id, this.selectedUser.attuid).promise().then((userAppRolesResult) => {
- //$log.debug('NewUserModalCtrl::getUserAppsRoles: got a result for app: ',app.id,': ',app.name,': ',userAppRolesResult);
- app.appRoles = userAppRolesResult;
- app.isLoading = false;
- }).catch(err => {
- $log.error(err);
- app.isError = true;
- app.isLoading = false;
- app.errorMessage = err.headers('FEErrorString');
- //$log.debug('NewUserModalCtrl::getUserAppsRoles: in new-user.controller: response header: '+err.headers('FEErrorString'));
- }).finally(()=>{
- this.numberAppsProcessed++;
- if (this.numberAppsProcessed === this.adminApps.length) {
- this.isLoading = false;
- }
- });
- }
- })
- return;
- }).catch(err => {
- $log.error(err);
- })
-
- }
-
-
- /**
- * Update the selected user apps with the new roles.
- * If no roles remain, set the user to inactive.
- */
- this.updateUserAppsRoles = () => {
- // $log.debug('NewUserModalCtrl::updateUserAppsRoles: entering updateUserAppsRoles');
- if(!this.selectedUser || !this.selectedUser.attuid || !this.adminApps){
- $log.error('NewUserModalCtrl::updateUserAppsRoles: mmissing arguments');
- return;
- }
- this.isSaving = true;
- confirmBoxService.makeUserAppRoleCatalogChanges('Are you sure you want to make these changes?')
- .then(confirmed => {
- if(confirmed === true){
- //$log.debug('NewUserModalCtrl::updateUserAppsRoles: going to update user: ' + this.selectedUser.attuid);
- this.numberAppsProcessed = 0;
- this.numberAppsSucceeded = 0;
- this.adminApps.forEach(app => {
- if (app.isChanged) {
- //$log.debug('NewUserModalCtrl::updateUserAppsRoles: app roles have changed; going to update: id: ', app.id, '; name: ', app.name);
- app.isUpdating = true;
- var UserAppRolesRequest = {
- attuid: this.selectedUser.attuid,
- appId: app.id,
- appRoles: app.appRoles,
- appName: app.name
- };
- this.isSaving = true;
- $log.debug('going to update user: ' + this.selectedUser.attuid + ' with app roles: ' + JSON.stringify(this.adminAppsRoles));
- applicationsService.saveUserAppsRoles(UserAppRolesRequest).then(res => {
- app.isUpdating = false;
- $scope.closeThisDialog(true);
- }).catch(err => {
- $log.error('NewAdminModalCtrl.updateAdminAppsRoles:: Failed - ' + err);
- }).finally(()=> {
- this.isSaving = false;
- })
- }
- });
- }else{
- this.isSaving = false;
- }
-
-
-
- });
-
- };
-
- /**
- * Navigate between dialog screens using step number: 1,2,...
- */
- this.navigateBack = () => {
- if (this.dialogState === 1) {
- //back from 1st screen?
- }
- if (this.dialogState === 3) {
- this.dialogState = 1;
- }
- };
-
- init();
-
- $scope.$on('$stateChangeStart', e => {
- //Disable navigation when modal is opened
- //**Nabil - note: this will cause the history back state to be replaced with current state
- e.preventDefault();
- });
- }
- }
- NewCatalogModalCtrl.$inject = ['$scope', '$log', 'usersService', 'catalogService', 'applicationsService', 'confirmBoxService'];
- angular.module('ecompApp').controller('NewCatalogModalCtrl', NewCatalogModalCtrl);
-})();
diff --git a/ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.modal.html b/ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.modal.html
deleted file mode 100644
index 3578cc09..00000000
--- a/ecomp-portal-FE-os/client/src/views/catalog/add-catalog-dialogs/new-catalog.modal.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!--
- ================================================================================
- 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.
- ================================================================================
- -->
-<div class="new-catalog-modal">
-
- <div class="user-catalog-roles" ng-show="userInfo.dialogState===2">
- <div >
- <div class=display-userApp-Catalog-Roles >{{titleText}}</div>
- <div class="title"
- ng-bind="userInfo.selectedUser.firstName + ' ' + userInfo.selectedUser.lastName + ' (' + userInfo.selectedUser.attuid + ')'"></div>
- </div>
- <div class="app-roles-main">
-
- <div class="app-catalog-roles-list">
- <div class="app-catalog-item" ng-repeat="app in userInfo.adminApps"
- ng-if="app.name === userInfo.selectedUser.headerText"
- id="app-name-{{app.name.split(' ').join('-')}}">
- <div class="app-catalog-item-left"
- id="div-app-name-{{app.name.split(' ').join('-')}}">{{app.name
- | elipsis: 27}}</div>
- <div class="app-catalog-item-right"
- id="div-app-name-dropdown-{{app.name.split(' ').join('-')}}"
- ng-show="!app.isError && !app.isLoading && !app.noChanges && !app.isUpdating && !app.isDoneUpdating && !app.isErrorUpdating"
- ng-if="userAppRoles.length===0">
- <multiple-select id="app-roles" unique-data="{{$index}}"
- placeholder="Select roles" ng-model="app.appRoles"
- on-change="userInfo.appChanged($index)" name-attr="roleName"
- value-attr="isApplied"></multiple-select>
- </div>
-
- <div class="app-catalog-item-right"
- id="div-app-name-dropdown-{{app.name.split(' ').join('-')}}"
- ng-show="!app.isError && !app.isLoading && !app.noChanges && !app.isUpdating && !app.isDoneUpdating && !app.isErrorUpdating"
- ng-if="userAppRoles.length!==0">
- <multiple-select2 id="app-roles" unique-data="{{$index}}"
- placeholder="Select roles" ng-model="app.appRoles"
- on-change="userInfo.appChanged($index)" name-attr="roleName"
- value-attr="isApplied"></multiple-select2>
- </div>
-
-
- <div id="app-item-no-contact" class="app-catalog-item-right-error"
- ng-show="app.isError">{{app.errorMessage | elipsis: 35}}</div>
- <div id="app-item-contacting"
- class="app-catalog-item-right-contacting" ng-show="app.isLoading">Contacting
- application...</div>
- <div id="app-item-no-changes"
- class="app-catalog-item-right-contacting" ng-show="app.noChanges">No
- changes</div>
- <div id="app-item-no-updating"
- class="app-catalog-item-right-contacting" ng-show="app.isUpdating">Updating
- application...</div>
- <div id="app-item-done-updating"
- class="app-catalog-item-right-contacting"
- ng-show="app.isDoneUpdating">Finished updating application</div>
- <div id="app-item-cannot-update"
- class="app-catalog-item-right-error" ng-show="app.isErrorUpdating">Could
- not update application...</div>
- <div id='ecomp-small-spinner' class="ecomp-small-spinner"
- ng-show="app.isLoading"></div>
- </div>
-
- &nbsp;
-
- <div class="usr-app-roles" ng-show=displyUserAppCatalogRoles>
- <div class="userApp-Catalog-Roles-label">{{title}}</div>
- &nbsp;
- <div class="display-userApp-Catalog-Roles-value"
- style="height: 150px; width: 200px; overflow-y: auto;">
- <div ng-repeat="getUserApplicationRole in userAppRoles">
-
- <div class="userAppCatalog-lbl-value">
- <span class="userAppCatalog-lbl-value-spn">
- {{getUserApplicationRole.rolename}}</span>
- </div>
-
- </div>
- </div>
-
- </div>
- </div>
-
- <div class="dialog-control">
- <span id="ecomp-save-spinner" class="ecomp-save-spinner"
- ng-show="userInfo.isSaving || userInfo.isGettingAdminApps"></span>
- <button id="new-user-next-button" class="next-button"
- ng-click="userInfo.updateUserAppsRoles()"
- ng-disabled="(!userInfo.anyChanges == true)">Submit</button>
- <div id="new-user-cancel-button" class="cancel-button"
- ng-click="closeThisDialog()">Cancel</div>
- </div>
-
- </div>
-
- </div>
-
-</div>
diff --git a/ecomp-portal-FE-os/client/src/views/catalog/get-accessswitch.html b/ecomp-portal-FE-os/client/src/views/catalog/get-accessswitch.html
new file mode 100644
index 00000000..5cda74a4
--- /dev/null
+++ b/ecomp-portal-FE-os/client/src/views/catalog/get-accessswitch.html
@@ -0,0 +1,10 @@
+<div class="gridster-box-content"
+ ng-style="{'cursor':'pointer',
+ 'background-image': 'url('+(item.imageLink)+')',
+ 'order': item.order,
+ 'background-color':'white',
+ 'background-repeat': 'no-repeat',
+ 'background-size': '170px 130px'}"
+ ng-click="catalog.getAccess(item)"
+ ng-hide="users.isLoadingTable && !users.getAppCatalogIsDone">
+</div> \ No newline at end of file
diff --git a/ecomp-portal-FE-os/client/src/views/footer/footer.controller.js b/ecomp-portal-FE-os/client/src/views/footer/footer.controller.js
index 5db3ed0f..d21c829e 100644
--- a/ecomp-portal-FE-os/client/src/views/footer/footer.controller.js
+++ b/ecomp-portal-FE-os/client/src/views/footer/footer.controller.js
@@ -20,18 +20,24 @@
'use strict';
(function () {
class FooterCtrl {
- constructor($scope, $rootScope, manifestService, $log) {
+ constructor($scope, $rootScope, manifestService, $log, menusService) {
this.manifestService = manifestService;
this.$log = $log;
this.$scope = $scope;
this.$rootScope = $rootScope;
-
$scope.buildinfo = null;
$rootScope.showFooter = true;
$scope.date = new Date();
-
-
+ $scope.ecompTitle='';
+
+ menusService.getEcompPortalTitle()
+ .then(title=> {
+ $scope.ecompTitle = title.response;
+ }).catch(err=> {
+ $log.error('FooterCtrl.getEcompPortalTitle:: Error retrieving ECMOP portal title: ' + err);
+ });
+
manifestService.getManifest().then( jsonObj => {
// $log.debug('FooterCtrl.getManifest: ', JSON.stringify(jsonObj));
$scope.buildInfo = jsonObj;
@@ -43,6 +49,6 @@
}
- FooterCtrl.$inject = ['$scope', '$rootScope', 'manifestService', '$log'];
+ FooterCtrl.$inject = ['$scope', '$rootScope', 'manifestService', '$log', 'menusService'];
angular.module('ecompApp').controller('FooterCtrl', FooterCtrl);
})();
diff --git a/ecomp-portal-FE-os/client/src/views/footer/footer.tpl.html b/ecomp-portal-FE-os/client/src/views/footer/footer.tpl.html
index 37148abf..b03e8da5 100644
--- a/ecomp-portal-FE-os/client/src/views/footer/footer.tpl.html
+++ b/ecomp-portal-FE-os/client/src/views/footer/footer.tpl.html
@@ -23,10 +23,13 @@
<div id="footer-info" class="attFooterInfo" style="text-align: center;">
<div id="footer-last-section" class="footerLastSection">
<div id="footer-text" class="footerText">
- OpenECOMP Portal Version {{buildInfo.manifest['Manifest-Version']}}.
- </div>
- <div id="display-inline" class="displayInline">
- </div>
+ {{ecompTitle}} Version {{buildInfo.manifest['Build-Number']}}.
+ </div>
+ <div id="display-inline" class="displayInline">
+ </div>
+ </div>
+ <div>
+ <img src="assets/images/onap-logo.png" alt="Onap Logo" class="onap-title-logo-footer" >
</div>
</div>
</div>
diff --git a/ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.controller.js b/ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.controller.js
new file mode 100644
index 00000000..0c152062
--- /dev/null
+++ b/ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.controller.js
@@ -0,0 +1,20 @@
+/*-
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+/*As Recommendation code belongs to internal use Just kept an empty file in order to avoid 404 errors in the browser console */ \ No newline at end of file
diff --git a/ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.tpl.html b/ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.tpl.html
new file mode 100644
index 00000000..68917389
--- /dev/null
+++ b/ecomp-portal-FE-os/client/src/views/headerRecommendation/headerRecommendations.tpl.html
@@ -0,0 +1,21 @@
+<!--
+ ================================================================================
+ 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.
+ ================================================================================
+ -->
+
+<!-- As Recommendation code belongs to Internal use Just kept an empty file in order to avoid 404 errors in the browser console --> \ No newline at end of file