You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2014/03/06 23:22:53 UTC

[08/28] git commit: USERGRID-86: Remove restriction on 10 apps in the portal

USERGRID-86: Remove restriction on 10 apps in the portal


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/bf075e6c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/bf075e6c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/bf075e6c

Branch: refs/pull/70/head
Commit: bf075e6c33447f890362ba2e56eaacf1c6efd511
Parents: 631f02d
Author: Shawn Feldman <sh...@gmail.com>
Authored: Thu Mar 6 14:22:27 2014 -0700
Committer: Shawn Feldman <sh...@gmail.com>
Committed: Thu Mar 6 14:22:27 2014 -0700

----------------------------------------------------------------------
 portal/Gruntfile.js                           |   30 +
 portal/bower.json                             |    1 +
 portal/config.js                              |   26 +-
 portal/index-debug.html                       |   18 +-
 portal/index-template.html                    |    2 +-
 portal/index.html                             |   18 +-
 portal/js/app.js                              |   16 +-
 portal/js/global/page-controller.js           |   66 +-
 portal/js/global/page-title.html              |    2 +-
 portal/js/global/ug-service.js                |   76 +-
 portal/js/libs/usergrid-libs.min.js           |   22 +-
 portal/js/libs/usergrid.sdk.js                |    5 +
 portal/js/login/forgot-password-controller.js |    1 -
 portal/js/login/login-controller.js           |    8 +-
 portal/js/login/login.html                    |    6 +
 portal/js/menus/appMenu.html                  |    7 +-
 portal/js/menus/menu-directives.js            |    1 -
 portal/js/org-overview/org-overview.html      |    4 +-
 portal/js/templates.js                        |   57 +-
 portal/js/usergrid-dev.min.js                 |  187 +-
 portal/js/usergrid.min.js                     |   12 +-
 portal/js/users/users-feed-controller.js      |   29 +
 portal/js/users/users-feed.html               |   27 +
 portal/js/users/users.html                    |    1 +
 portal/package.json                           |    5 +-
 portal/phantomjsdriver.log                    | 3869 --------------------
 portal/seleniumLog.txt                        |    0
 portal/tests/unit/sample.spec.js              |    3 +-
 28 files changed, 449 insertions(+), 4050 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/Gruntfile.js
----------------------------------------------------------------------
diff --git a/portal/Gruntfile.js b/portal/Gruntfile.js
index d7cb184..e35c24d 100644
--- a/portal/Gruntfile.js
+++ b/portal/Gruntfile.js
@@ -68,6 +68,8 @@ module.exports = function (grunt) {
             'js/libs/angular-1.2.5/angular-sanitize.min.js',
             'js/libs/usergrid.sdk.js',
             'js/libs/MD5.min.js',
+            'bower_components/angularitics/dist/angulartics.min.js',
+            'bower_components/angularitics/dist/angulartics-google-analytics.min.js',
             'js/libs/ui-bootstrap/ui-bootstrap-custom-tpls-0.3.0.min.js',
             'js/libs/jqueryui/jquery-ui-1.8.18.min.js',
             'js/libs/jqueryui/date.min.js'
@@ -317,6 +319,33 @@ module.exports = function (grunt) {
           copy:false
         }
       }
+    },
+    s3: {
+      options: {
+        key: process.env.AWS_KEY || 'noidea',
+        secret: process.env.AWS_SECRET || 'noidea',
+        bucket: 'appservices-deployments',
+        access: 'public-read',
+        headers: {
+          // Two Year cache policy (1000 * 60 * 60 * 24 * 730)
+          "Cache-Control": "max-age=630720000, public",
+          "Expires": new Date(Date.now() + 63072000000).toUTCString()
+        }
+      },
+      dev: {
+        // These options override the defaults
+        options: {
+          encodePaths: false,
+          maxOperations: 20
+        },
+        // Files to be uploaded.
+        upload: [
+          {
+            src: 'dist/appsvc-ui.'+packageJson.version+'.zip',
+            dest: '/production-releases/dist/appsvc-ui.'+packageJson.version+'.zip'
+          }
+        ]
+      }
     }
   });
 
@@ -333,6 +362,7 @@ module.exports = function (grunt) {
   grunt.loadNpmTasks('grunt-protractor-runner');
   grunt.loadNpmTasks('grunt-karma');
   grunt.loadNpmTasks('grunt-dom-munger');
+  grunt.loadNpmTasks('grunt-s3');
 
   // Default task(s).
   grunt.registerTask('dev', ['connect:server', 'watch']);

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/bower.json
----------------------------------------------------------------------
diff --git a/portal/bower.json b/portal/bower.json
index 98a9d65..bb34bca 100644
--- a/portal/bower.json
+++ b/portal/bower.json
@@ -3,6 +3,7 @@
   "version": "2.0.12",
   "ignore": [],
   "dependencies": {
+    "angularitics": "~0.8.7",
     "apigee-sdk": "~2.0.8"
   },
   "devDependencies": {},

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/config.js
----------------------------------------------------------------------
diff --git a/portal/config.js b/portal/config.js
index c2f31d1..e08e78f 100644
--- a/portal/config.js
+++ b/portal/config.js
@@ -1,12 +1,29 @@
 var Usergrid = Usergrid || {};
 
+//Google Analytics
+var _gaq = _gaq || [];
+_gaq.push(['_setAccount', 'UA-4084158-4']);
+try{
+    (function(document) {
+        if(!document){
+            return;
+        }
+        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+    })(document || null);
+}catch(e){};
+//End Google Analytics
+
 Usergrid.showNotifcations = true;
 
+
 // used only if hostname does not match a real server name
 Usergrid.overrideUrl = 'https://api.usergrid.com/';
 
 Usergrid.options = {
   client:{
+    requiresDeveloperKey:false
    // apiKey:'123456'
   },
   showAutoRefresh:true,
@@ -74,7 +91,10 @@ Usergrid.regex = {
   collectionNameRegexDescription: "Collection name only allows : a-z A-Z 0-9. Must be between 3-25 characters."
 };
 try{
-  if(module && module.exports){
-    module.exports = Usergrid;
+  if (typeof module !== 'undefined'){
+
+    if(module && module.exports){
+      module.exports = Usergrid;
+  }
   }
-}catch(e){}
\ No newline at end of file
+}catch(e){}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/index-debug.html
----------------------------------------------------------------------
diff --git a/portal/index-debug.html b/portal/index-debug.html
index 8aea400..7b8dcec 100644
--- a/portal/index-debug.html
+++ b/portal/index-debug.html
@@ -8,12 +8,12 @@
   <meta name="description" content="">
   <meta name="author" content="">
 
-  <link id="libScript" href="2.0.34/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
-  <link id="libScript" href="2.0.34/css/dash.min.css" rel="stylesheet">
+  <link id="libScript" href="2.0.36/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
+  <link id="libScript" href="2.0.36/css/dash.min.css" rel="stylesheet">
 
   <!--styles for jquery ui calendar component-->
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.34/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.34/js/libs/jqueryui/jquery-ui-timepicker.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.36/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.36/js/libs/jqueryui/jquery-ui-timepicker.css">
 </head>
 <body ng-controller="PageCtrl">
 <!-- Google Tag Manager -->
@@ -109,20 +109,20 @@
 
         <footer>
           <hr>
-          <p class="pull-right">&copy; Apigee 2013</p>
+          <p class="pull-right">&copy; Apigee 2014</p>
         </footer>
       </div>
     </div>
   </div>
 </section>
-<script id="libScript" src="2.0.34/js/libs/usergrid-libs.min.js"></script>
-<script id="libScript" src="2.0.34/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
+<script id="libScript" src="2.0.36/js/libs/usergrid-libs.min.js"></script>
+<script id="libScript" src="2.0.36/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
 <!--todo - remove this. temporarily including jquery ui for calendar in push-->
-<script id="libScript" src="2.0.34/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
+<script id="libScript" src="2.0.36/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
 <!-- In dev use: <script src="js/libs/angular-1.1.5.js"></script> -->
 <!--<script type="text/javascript" src="js/libs/angular-ui-ng-grid/ng-grid-2.0.2.debug.js"></script>-->
 <script src="config.js"></script>
-<script id="main-script" src="2.0.34/js/usergrid-dev.min.js"></script>
+<script id="main-script" src="2.0.36/js/usergrid-dev.min.js"></script>
 
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/index-template.html
----------------------------------------------------------------------
diff --git a/portal/index-template.html b/portal/index-template.html
index 2c7ddfd..650ef42 100644
--- a/portal/index-template.html
+++ b/portal/index-template.html
@@ -110,7 +110,7 @@
 
         <footer>
           <hr>
-          <p class="pull-right">&copy; Apigee 2013</p>
+          <p class="pull-right">&copy; Apigee 2014</p>
         </footer>
       </div>
     </div>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/index.html
----------------------------------------------------------------------
diff --git a/portal/index.html b/portal/index.html
index 2285ff5..95b6eb8 100644
--- a/portal/index.html
+++ b/portal/index.html
@@ -8,12 +8,12 @@
   <meta name="description" content="">
   <meta name="author" content="">
 
-  <link id="libScript" href="2.0.34/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
-  <link id="libScript" href="2.0.34/css/dash.min.css" rel="stylesheet">
+  <link id="libScript" href="2.0.36/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
+  <link id="libScript" href="2.0.36/css/dash.min.css" rel="stylesheet">
 
   <!--styles for jquery ui calendar component-->
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.34/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.34/js/libs/jqueryui/jquery-ui-timepicker.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.36/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.36/js/libs/jqueryui/jquery-ui-timepicker.css">
 </head>
 <body ng-controller="PageCtrl">
 <!-- Google Tag Manager -->
@@ -109,20 +109,20 @@
 
         <footer>
           <hr>
-          <p class="pull-right">&copy; Apigee 2013</p>
+          <p class="pull-right">&copy; Apigee 2014</p>
         </footer>
       </div>
     </div>
   </div>
 </section>
-<script id="libScript" src="2.0.34/js/libs/usergrid-libs.min.js"></script>
-<script id="libScript" src="2.0.34/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
+<script id="libScript" src="2.0.36/js/libs/usergrid-libs.min.js"></script>
+<script id="libScript" src="2.0.36/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
 <!--todo - remove this. temporarily including jquery ui for calendar in push-->
-<script id="libScript" src="2.0.34/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
+<script id="libScript" src="2.0.36/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
 <!-- In dev use: <script src="js/libs/angular-1.1.5.js"></script> -->
 <!--<script type="text/javascript" src="js/libs/angular-ui-ng-grid/ng-grid-2.0.2.debug.js"></script>-->
 <script src="config.js"></script>
-<script id="main-script" src="2.0.34/js/usergrid.min.js"></script>
+<script id="main-script" src="2.0.36/js/usergrid.min.js"></script>
 
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/js/app.js
----------------------------------------------------------------------
diff --git a/portal/js/app.js b/portal/js/app.js
index 9ed6816..0954859 100644
--- a/portal/js/app.js
+++ b/portal/js/app.js
@@ -51,20 +51,25 @@ AppServices.Services = angular.module('appservices.services', []);
 AppServices.Controllers = angular.module('appservices.controllers', []);
 AppServices.Filters = angular.module('appservices.filters', []);
 AppServices.Directives = angular.module('appservices.directives', []);
+AppServices.Performance = angular.module('appservices.performance', []);
+AppServices.Push = angular.module('appservices.push', []);
 
 angular.module('appservices',
     [ 'ngRoute',
       'ngResource',
       'ngSanitize',
       'ui.bootstrap',
+      'angulartics',
+      'angulartics.google.analytics',
       'appservices.filters',
       'appservices.services',
       'appservices.directives',
       'appservices.constants',
       'appservices.controllers',
-
-    ]).config(['$routeProvider', '$locationProvider','$sceDelegateProvider',
-        function ($routeProvider,$locationProvider,$sceDelegateProvider) {
+      'appservices.performance',
+      'appservices.push'
+    ]).config(['$routeProvider', '$locationProvider','$sceDelegateProvider','$analyticsProvider',
+        function ($routeProvider,$locationProvider,$sceDelegateProvider, $analyticsProvider) {
             $routeProvider
                 .when('/org-overview', {templateUrl: 'org-overview/org-overview.html', controller: 'OrgOverviewCtrl'})
                 .when('/login', {templateUrl: 'login/login.html', controller: 'LoginCtrl'})
@@ -77,6 +82,7 @@ angular.module('appservices',
                 .when('/users/profile', {templateUrl: 'users/users-profile.html', controller: 'UsersProfileCtrl'})
                 .when('/users/groups', {templateUrl: 'users/users-groups.html', controller: 'UsersGroupsCtrl'})
                 .when('/users/activities', {templateUrl: 'users/users-activities.html', controller: 'UsersActivitiesCtrl'})
+                .when('/users/feed', {templateUrl: 'users/users-feed.html', controller: 'UsersFeedCtrl'})
                 .when('/users/graph', {templateUrl: 'users/users-graph.html', controller: 'UsersGraphCtrl'})
                 .when('/users/roles', {templateUrl: 'users/users-roles.html', controller: 'UsersRolesCtrl'})
                 .when('/groups', {templateUrl: 'groups/groups.html', controller: 'GroupsCtrl'})
@@ -112,4 +118,8 @@ angular.module('appservices',
                 'https://appservices.apigee.com/**',
                 'https://api.usergrid.com/**'
             ]);
+
+            $analyticsProvider.virtualPageviews(false);
+            $analyticsProvider.firstPageview(false);
+
         }]);

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/js/global/page-controller.js
----------------------------------------------------------------------
diff --git a/portal/js/global/page-controller.js b/portal/js/global/page-controller.js
index 8e789d0..0e4ad60 100644
--- a/portal/js/global/page-controller.js
+++ b/portal/js/global/page-controller.js
@@ -10,7 +10,8 @@ AppServices.Controllers.controller('PageCtrl',
     '$routeParams',
     '$q',
     '$route',
-    '$log', function (
+    '$log',
+    '$analytics', function (
                      ug,
                      utility,
                      $scope,
@@ -19,8 +20,8 @@ AppServices.Controllers.controller('PageCtrl',
                      $routeParams,
                      $q,
                      $route,
-                     $log
-                     ) {
+                     $log,
+                     $analytics) {
 
   var initScopeVariables = function(){
     //$rootScope.urls()... will determine which URL should be used for a given environment
@@ -38,6 +39,7 @@ AppServices.Controllers.controller('PageCtrl',
     $rootScope.demoData = false;
     $scope.queryStringApplied = false;
     $rootScope.autoUpdateTimer = Usergrid.config ? Usergrid.config.autoUpdateTimer : 61;
+    $rootScope.requiresDeveloperKey = Usergrid.config ? Usergrid.config.client.requiresDeveloperKey : false;
     $rootScope.loaded = $rootScope.activeUI = false;
     for (var key in Usergrid.regex) {
       $scope[key] = Usergrid.regex[key];
@@ -59,52 +61,11 @@ AppServices.Controllers.controller('PageCtrl',
   initScopeVariables();
 
   $rootScope.urls = function(){
-    var BASE_URL = '';
-    var DATA_URL = '';
-    var qs = $location.search();
-
-    switch(true){
-      case $location.host() === 'appservices.apigee.com' && location.pathname.indexOf('/dit') >= 0 :
-        //DIT
-        BASE_URL = 'https://accounts.jupiter.apigee.net';
-        DATA_URL = 'http://apigee-internal-prod.jupiter.apigee.net';
-        $scope.use_sso = true;
-        break;
-      case $location.host() === 'appservices.apigee.com' && location.pathname.indexOf('/mars') >= 0  :
-        //staging
-        BASE_URL = 'https://accounts.mars.apigee.net';
-        DATA_URL = 'http://apigee-internal-prod.mars.apigee.net';
-        $scope.use_sso = true;
-        break;
-      case $location.host() === 'appservices.apigee.com' :
-        //enterprise portals
-        DATA_URL = Usergrid.overrideUrl;
-        break;
-      case $location.host() === 'apigee.com' :
-        //prod
-        BASE_URL = 'https://accounts.apigee.com';
-        DATA_URL = 'https://api.usergrid.com';
-        $scope.use_sso = true;
-        break;
-      case $location.host() === 'usergrid.dev':
-        //development
-        DATA_URL = 'https://api.usergrid.com';
-        break;
-      default :
-        DATA_URL = Usergrid.overrideUrl;
-        break;
-    }
-    //override with querystring
-    DATA_URL =  qs.api_url || DATA_URL;
-    $scope.apiUrl = DATA_URL = DATA_URL.lastIndexOf('/') === DATA_URL.length - 1 ? DATA_URL.substring(0,DATA_URL.length-1) : DATA_URL;
-
-    return {
-      DATA_URL: DATA_URL,
-      LOGIN_URL: BASE_URL + '/accounts/sign_in',
-      PROFILE_URL: BASE_URL + '/accounts/my_account',
-      LOGOUT_URL: BASE_URL + '/accounts/sign_out'
-    }
-  }
+    var urls = ug.getUrls()
+    $scope.apiUrl = urls.apiUrl;
+    $scope.use_sso = urls.use_sso;
+    return urls;
+  };
 
   //used in users
   $rootScope.gotoPage = function(path){
@@ -392,6 +353,7 @@ AppServices.Controllers.controller('PageCtrl',
       $rootScope.$broadcast('alert', 'info', 'We are experiencing performance issues on our server.  Please click Get Help for support if this continues.');
     });
 
+    var lastPage = "";
     //verify on every route change
     $scope.$on('$routeChangeSuccess', function () {
       //todo possibly do a date check here for token expiry
@@ -401,6 +363,12 @@ AppServices.Controllers.controller('PageCtrl',
       if(!$scope.showDemoBar){
         $rootScope.demoData = false;
       }
+      setTimeout(function(){
+         lastPage = ""; //remove the double load event
+        },50);
+      var path = window.location.pathname.replace("index-debug.html","");
+      lastPage === "" && $analytics.pageTrack((path+$location.path()).replace("//","/"));
+      lastPage = $location.path();
     });
     $scope.$on('applications-received', function (event, applications) {
       $scope.applications = applications;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/js/global/page-title.html
----------------------------------------------------------------------
diff --git a/portal/js/global/page-title.html b/portal/js/global/page-title.html
index bc68348..77d4231 100644
--- a/portal/js/global/page-title.html
+++ b/portal/js/global/page-title.html
@@ -1,7 +1,7 @@
 <section class="row-fluid">
     <div class="span12">
         <div class="page-filters">
-            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="#" ng-click="showHelp()"  >(need help?)</a></h1>
+            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>
         </div>
     </div>
     <bsmodal id="need-help"

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/bf075e6c/portal/js/global/ug-service.js
----------------------------------------------------------------------
diff --git a/portal/js/global/ug-service.js b/portal/js/global/ug-service.js
index 6b620f2..95307b0 100644
--- a/portal/js/global/ug-service.js
+++ b/portal/js/global/ug-service.js
@@ -1,12 +1,19 @@
 'use strict';
 
-AppServices.Services.factory('ug', function (configuration, $rootScope,utility, $q, $http, $resource, $log) {
+AppServices.Services.factory('ug', function (configuration, $rootScope,utility, $q, $http, $resource, $log, $analytics,$location) {
 
   var requestTimes = [],
     running = false,
     currentRequests = {};
-  function reportError(data,config){
 
+  function reportError(data,config){
+    try {
+      $analytics.eventTrack('error', {
+        category: 'App Services', label: data + ':' + config.url + ':' + (sessionStorage['apigee_uuid'] || 'na')
+      });
+    } catch (e) {
+      console.log(e)
+    }
   };
   var getAccessToken = function(){
     return sessionStorage.getItem('accessToken');
@@ -20,6 +27,55 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
       this.client().set(prop,value);
 
     },
+    getUrls: function(){
+      var host = $location.host();
+      var qs = $location.search();
+      var BASE_URL = '';
+      var DATA_URL = '';
+      var use_sso = false;
+      switch (true) {
+        case host === 'appservices.apigee.com' && location.pathname.indexOf('/dit') >= 0 :
+          //DIT
+          BASE_URL = 'https://accounts.jupiter.apigee.net';
+          DATA_URL = 'http://apigee-internal-prod.jupiter.apigee.net';
+          use_sso = true;
+          break;
+        case host === 'appservices.apigee.com' && location.pathname.indexOf('/mars') >= 0  :
+          //staging
+          BASE_URL = 'https://accounts.mars.apigee.net';
+          DATA_URL = 'http://apigee-internal-prod.mars.apigee.net';
+          use_sso = true;
+          break;
+        case host === 'appservices.apigee.com' :
+          //enterprise portals
+          DATA_URL = Usergrid.overrideUrl;
+          break;
+        case host === 'apigee.com' :
+          //prod
+          BASE_URL = 'https://accounts.apigee.com';
+          DATA_URL = 'https://api.usergrid.com';
+          use_sso = true;
+          break;
+        case host === 'usergrid.dev':
+          //development
+          DATA_URL = 'https://api.usergrid.com';
+          break;
+        default :
+          DATA_URL = Usergrid.overrideUrl;
+          break;
+      }
+      //override with querystring
+      DATA_URL = qs.api_url || DATA_URL;
+      DATA_URL = DATA_URL.lastIndexOf('/') === DATA_URL.length - 1 ? DATA_URL.substring(0,DATA_URL.length-1) : DATA_URL;
+      return {
+        DATA_URL: DATA_URL,
+        LOGIN_URL: BASE_URL + '/accounts/sign_in',
+        PROFILE_URL: BASE_URL + '/accounts/my_account',
+        LOGOUT_URL: BASE_URL + '/accounts/sign_out',
+        apiUrl: DATA_URL,
+        use_sso:use_sso
+      };
+    },
     orgLogin:function(username,password){
       var self = this;
       this.client().set('email', username);
@@ -34,7 +90,6 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
         }
       });
     },
-
     checkAuthentication:function(force){
       var ug = this;
       var client = ug.client();
@@ -50,7 +105,6 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
               for (key in  $rootScope.applications) {
                 if ($rootScope.applications.hasOwnProperty(key)) size++;
               }
-              $rootScope.addApplications = size < 10;
               $rootScope.$broadcast('checkAuthentication-success', client.getObject('organizations'), client.getObject('applications'), client.get('orgName'), client.get('appName'), client.get('email'));
             });
           },
@@ -126,6 +180,9 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
       );
       return this._client;
     },
+    setClientProperty:function(key,value){
+      this.client().set(key, value);
+    },
     getTopCollections: function () {
       var options = {
         method:'GET',
@@ -442,7 +499,7 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
     getIndexes: function (path) {
       var options = {
         method:'GET',
-        endpoint: path + '/indexes'
+        endpoint: path.split('/').concat('indexes').filter(function(bit){return bit && bit.length}).join('/') 
       }
       this.client().request(options, function (err, data) {
         if (err) {
@@ -914,8 +971,9 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
           $rootScope.$broadcast('app-activities-received',data.entities);
         });
     },
-    getEntityActivities: function(entity){
-        var endpoint = entity.get('type') + '/' + entity.get('uuid') + '/activities' ;
+    getEntityActivities: function(entity, isFeed){
+        var route = isFeed ? 'feed' : 'activities'
+        var endpoint = entity.get('type') + '/' + entity.get('uuid') + '/'+route ;
         var options = {
           method:'GET',
           endpoint:endpoint,
@@ -923,12 +981,12 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
         };
         this.client().request(options, function (err, data) {
           if(err){
-            $rootScope.$broadcast(entity.get('type')+'-activities-error',data);
+            $rootScope.$broadcast(entity.get('type')+'-'+route+'-error',data);
           }
           data.entities.forEach(function(entityInstance) {
             entityInstance.createdDate = (new Date( entityInstance.created)).toUTCString();
           });
-          $rootScope.$broadcast(entity.get('type')+'-activities-received',data.entities);
+          $rootScope.$broadcast(entity.get('type')+'-'+route+'-received',data.entities);
         });
     },
     addUserActivity:function(user,content){