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/04/02 23:21:29 UTC
[28/39] merging upstream
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/67108093/portal/dist/usergrid-portal/js/usergrid-dev.min.js
----------------------------------------------------------------------
diff --cc portal/dist/usergrid-portal/js/usergrid-dev.min.js
index 0000000,66264b7..1568183
mode 000000,100644..100644
--- a/portal/dist/usergrid-portal/js/usergrid-dev.min.js
+++ b/portal/dist/usergrid-portal/js/usergrid-dev.min.js
@@@ -1,0 -1,4939 +1,4939 @@@
+ /*! usergrid@2.0.2 2014-04-02 */
+ (function(exports, global) {
+ global["true"] = exports;
+ "use strict";
+ var polyfills = function(window, Object) {
+ window.requestAnimFrame = function() {
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) {
+ window.setTimeout(callback, 1e3 / 60);
+ };
+ }();
+ Object.defineProperty(Object.prototype, "clone", {
+ enumerable: false,
+ writable: true,
+ value: function() {
+ var i, newObj = this instanceof Array ? [] : {};
+ for (i in this) {
+ if (i === "clone") {
+ continue;
+ }
+ if (this[i] && typeof this[i] === "object") {
+ newObj[i] = this[i].clone();
+ } else {
+ newObj[i] = this[i];
+ }
+ }
+ return newObj;
+ }
+ });
+ Object.defineProperty(Object.prototype, "stringifyJSON", {
+ enumerable: false,
+ writable: true,
+ value: function() {
+ return JSON.stringify(this, null, " ");
+ }
+ });
+ };
+ polyfills(window, Object);
+ var global = global || this;
+ var AppServices = AppServices || {};
+ global.AppServices = global.AppServices || AppServices;
+ AppServices.Constants = angular.module("appservices.constants", []);
+ 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.MAX = angular.module("appservices.max", []);
+ angular.module("appservices", [ "ngRoute", "ngResource", "ngSanitize", "ui.bootstrap", "angulartics", "angulartics.google.analytics", "appservices.filters", "appservices.services", "appservices.directives", "appservices.constants", "appservices.controllers", "appservices.max", "angular-intro" ]).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"
+ }).when("/login/loading", {
+ templateUrl: "login/loading.html",
+ controller: "LoginCtrl"
+ }).when("/app-overview/summary", {
+ templateUrl: "app-overview/app-overview.html",
+ controller: "AppOverviewCtrl"
+ }).when("/getting-started/setup", {
+ templateUrl: "app-overview/getting-started.html",
+ controller: "GettingStartedCtrl"
+ }).when("/forgot-password", {
+ templateUrl: "login/forgot-password.html",
+ controller: "ForgotPasswordCtrl"
+ }).when("/register", {
+ templateUrl: "login/register.html",
+ controller: "RegisterCtrl"
+ }).when("/users", {
+ templateUrl: "users/users.html",
+ controller: "UsersCtrl"
+ }).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"
+ }).when("/groups/details", {
+ templateUrl: "groups/groups-details.html",
+ controller: "GroupsDetailsCtrl"
+ }).when("/groups/members", {
+ templateUrl: "groups/groups-members.html",
+ controller: "GroupsMembersCtrl"
+ }).when("/groups/activities", {
+ templateUrl: "groups/groups-activities.html",
+ controller: "GroupsActivitiesCtrl"
+ }).when("/groups/roles", {
+ templateUrl: "groups/groups-roles.html",
+ controller: "GroupsRolesCtrl"
+ }).when("/roles", {
+ templateUrl: "roles/roles.html",
+ controller: "RolesCtrl"
+ }).when("/roles/settings", {
+ templateUrl: "roles/roles-settings.html",
+ controller: "RolesSettingsCtrl"
+ }).when("/roles/users", {
+ templateUrl: "roles/roles-users.html",
+ controller: "RolesUsersCtrl"
+ }).when("/roles/groups", {
+ templateUrl: "roles/roles-groups.html",
+ controller: "RolesGroupsCtrl"
+ }).when("/data", {
+ templateUrl: "data/data.html",
+ controller: "DataCtrl"
+ }).when("/data/entity", {
+ templateUrl: "data/entity.html",
+ controller: "EntityCtrl"
+ }).when("/data/shell", {
+ templateUrl: "data/shell.html",
+ controller: "ShellCtrl"
+ }).when("/profile/organizations", {
+ templateUrl: "profile/organizations.html",
+ controller: "OrgCtrl"
+ }).when("/profile/profile", {
+ templateUrl: "profile/profile.html",
+ controller: "ProfileCtrl"
+ }).when("/profile", {
+ templateUrl: "profile/account.html",
+ controller: "AccountCtrl"
+ }).when("/activities", {
+ templateUrl: "activities/activities.html",
+ controller: "ActivitiesCtrl"
+ }).when("/shell", {
+ templateUrl: "shell/shell.html",
+ controller: "ShellCtrl"
+ }).when("/logout", {
+ templateUrl: "login/logout.html",
+ controller: "LogoutCtrl"
+ }).otherwise({
+ redirectTo: "/org-overview"
+ });
+ $locationProvider.html5Mode(false).hashPrefix("!");
+ $sceDelegateProvider.resourceUrlWhitelist([ "self", "http://apigee-internal-prod.jupiter.apigee.net/**", "http://apigee-internal-prod.mars.apigee.net/**", "https://appservices.apigee.com/**", "https://api.usergrid.com/**" ]);
+ $analyticsProvider.virtualPageviews(false);
+ $analyticsProvider.firstPageview(false);
+ } ]);
+ AppServices.Controllers.controller("ActivitiesCtrl", [ "ug", "$scope", "$rootScope", "$location", "$route", function(ug, $scope, $rootScope, $location, $route) {
+ $scope.$on("app-activities-received", function(evt, data) {
+ $scope.activities = data;
+ $scope.$apply();
+ });
+ $scope.$on("app-activities-error", function(evt, data) {
+ $rootScope.$broadcast("alert", "error", "Application failed to retreive activities data.");
+ });
+ ug.getActivities();
+ } ]);
+ "use strict";
+ AppServices.Controllers.controller("AppOverviewCtrl", [ "ug", "charts", "$scope", "$rootScope", "$log", function(ug, charts, $scope, $rootScope, $log) {
+ var createGradient = function(color1, color2) {
+ var perShapeGradient = {
+ x1: 0,
+ y1: 0,
+ x2: 0,
+ y2: 1
+ };
+ return {
+ linearGradient: perShapeGradient,
+ stops: [ [ 0, color1 ], [ 1, color2 ] ]
+ };
+ };
+ $scope.appOverview = {};
+ $scope.collections = [];
+ $scope.graph = "";
+ $scope.$on("top-collections-received", function(event, collections) {
+ var dataDescription = {
+ bar1: {
+ labels: [ "Total" ],
+ dataAttr: [ "title", "count" ],
+ colors: [ createGradient("rgba(36,151,212,0.6)", "rgba(119,198,240,0.6)") ],
+ borderColor: "#1b97d1"
+ }
+ };
+ $scope.collections = collections;
+ var arr = [];
+ for (var i in collections) {
+ if (collections.hasOwnProperty(i)) {
+ arr.push(collections[i]);
+ }
+ }
+ $scope.appOverview = {};
+ if (!$rootScope.chartTemplate) {
+ ug.httpGet(null, "js/charts/highcharts.json").then(function(success) {
+ $rootScope.chartTemplate = success;
+ $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
+ $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
+ $scope.applyScope();
+ }, function(fail) {
+ $log.error("Problem getting chart template", fail);
+ });
+ } else {
+ $scope.appOverview.chart = angular.copy($rootScope.chartTemplate.pareto);
+ $scope.appOverview.chart = charts.convertParetoChart(arr, $scope.appOverview.chart, dataDescription.bar1, "1h", "NOW");
+ $scope.applyScope();
+ }
+ });
+ $scope.$on("app-initialized", function() {
+ ug.getTopCollections();
+ });
+ if ($rootScope.activeUI) {
+ ug.getTopCollections();
+ }
+ } ]);
+ "use strict";
+ AppServices.Controllers.controller("GettingStartedCtrl", [ "ug", "$scope", "$rootScope", "$location", "$timeout", "$anchorScroll", function(ug, $scope, $rootScope, $location, $timeout, $anchorScroll) {
+ $scope.collections = [];
+ $scope.graph = "";
+ $scope.clientID = "";
+ $scope.clientSecret = "";
+ var getKeys = function() {
+ return ug.jsonpRaw("credentials", "", {});
+ };
+ $scope.regenerateCredentialsDialog = function(modalId) {
+ $scope.orgAPICredentials = {
+ client_id: "regenerating...",
+ client_secret: "regenerating..."
+ };
+ ug.regenerateAppCredentials();
+ $scope.hideModal(modalId);
+ };
+ $scope.$on("app-creds-updated", function(event, credentials) {
+ if (credentials) {
+ $scope.clientID = credentials.client_id;
+ $scope.clientSecret = credentials.client_secret;
+ if (!$scope.$$phase) {
+ $scope.$apply();
+ }
+ } else {
+ setTimeout(function() {
+ ug.getAppCredentials();
+ }, 5e3);
+ }
+ });
+ ug.getAppCredentials();
+ $scope.contentTitle;
+ $scope.showSDKDetail = function(name) {
+ var introContainer = document.getElementById("intro-container");
+ if (name === "nocontent") {
+ introContainer.style.height = "0";
+ return true;
+ }
+ introContainer.style.opacity = .1;
+ introContainer.style.height = "0";
+ var timeout = 0;
+ if ($scope.contentTitle) {
+ timeout = 500;
+ }
+ $timeout(function() {
+ introContainer.style.height = "1000px";
+ introContainer.style.opacity = 1;
+ }, timeout);
+ $scope.optionName = name;
+ $scope.contentTitle = name;
+ $scope.sdkLink = "http://apigee.com/docs/content/" + name + "-sdk-redirect";
+ $scope.docsLink = "http://apigee.com/docs/app-services/content/installing-apigee-sdk-" + name;
+ $scope.getIncludeURL = function() {
+ return "app-overview/doc-includes/" + $scope.optionName + ".html";
+ };
+ };
+ $scope.scrollToElement = function(elem) {
+ $location.hash(elem);
+ $anchorScroll();
+ return false;
+ };
+ } ]);
+ "use strict";
+ AppServices.Controllers.controller("ChartCtrl", [ "$scope", "$location", function($scope, $location) {} ]);
+ "use strict";
+ AppServices.Directives.directive("chart", function($rootScope) {
+ return {
+ restrict: "E",
+ scope: {
+ chartdata: "=chartdata"
+ },
+ template: "<div></div>",
+ replace: true,
+ controller: function($scope, $element) {},
+ link: function(scope, element, attrs) {
+ scope.$watch("chartdata", function(chartdata, oldchartdata) {
+ if (chartdata) {
+ var chartsDefaults = {
+ chart: {
+ renderTo: element[0],
+ type: attrs.type || null,
+ height: attrs.height || null,
+ width: attrs.width || null,
+ reflow: true,
+ animation: false,
+ zoomType: "x"
+ }
+ };
+ if (attrs.type === "pie") {
+ chartsDefaults.chart.margin = [ 0, 0, 0, 0 ];
+ chartsDefaults.chart.spacingLeft = 0;
+ chartsDefaults.chart.spacingRight = 0;
+ chartsDefaults.chart.spacingTop = 0;
+ chartsDefaults.chart.spacingBottom = 0;
+ if (attrs.titleimage) {
+ chartdata.title.text = '<img src="' + attrs.titleimage + '">';
+ }
+ if (attrs.titleicon) {
+ chartdata.title.text = '<i class="pictogram ' + attrs.titleiconclass + '">' + attrs.titleicon + "</i>";
+ }
+ if (attrs.titlecolor) {
+ chartdata.title.style.color = attrs.titlecolor;
+ }
+ if (attrs.titleimagetop) {
+ chartdata.title.style.marginTop = attrs.titleimagetop;
+ }
+ if (attrs.titleimageleft) {
+ chartdata.title.style.marginLeft = attrs.titleimageleft;
+ }
+ }
+ if (attrs.type === "line") {
+ chartsDefaults.chart.marginTop = 30;
+ chartsDefaults.chart.spacingTop = 50;
+ }
+ if (attrs.type === "column") {
+ chartsDefaults.chart.marginBottom = 80;
+ }
+ if (attrs.type === "area") {
+ chartsDefaults.chart.spacingLeft = 0;
+ chartsDefaults.chart.spacingRight = 0;
+ chartsDefaults.chart.marginLeft = 0;
+ chartsDefaults.chart.marginRight = 0;
+ }
+ Highcharts.setOptions({
+ global: {
+ useUTC: false
+ },
+ chart: {
+ style: {
+ fontFamily: "marquette-light, Helvetica, Arial, sans-serif"
+ }
+ }
+ });
+ if (attrs.type === "line") {
+ var xAxis1 = chartdata.xAxis[0];
+ if (!xAxis1.labels.formatter) {
+ xAxis1.labels.formatter = new Function(attrs.xaxislabel);
+ }
+ if (!xAxis1.labels.step) {
+ xAxis1.labels.step = attrs.xaxisstep;
+ }
+ }
+ if (chartdata.tooltip) {
+ if (typeof chartdata.tooltip.formatter === "string") {
+ chartdata.tooltip.formatter = new Function(chartdata.tooltip.formatter);
+ }
+ }
+ renderChart(chartsDefaults, chartdata);
+ }
+ }, true);
+ }
+ };
+ });
+ function renderChart(chartsDefaults, chartdata, attrs) {
+ var newSettings = {};
+ $.extend(true, newSettings, chartsDefaults, chartdata);
+ var chart = new Highcharts.Chart(newSettings);
+ }
+ AppServices.Services.factory("charts", function() {
+ var lineChart, areaChart, paretoChart, pieChart, pieCompare, xaxis, seriesIndex;
+ return {
+ convertLineChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+ lineChart = chartTemplate;
+ if (typeof chartData[0] === "undefined") {
+ chartData[0] = {};
+ chartData[0].datapoints = [];
+ }
+ var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
+ if (currentCompare === "YESTERDAY") {
+ seriesIndex = dataDescription.dataAttr.length;
+ label = "Yesterday ";
+ } else if (currentCompare === "LAST_WEEK") {
+ seriesIndex = dataDescription.dataAttr.length;
+ label = "Last Week ";
+ } else {
+ lineChart = chartTemplate;
+ seriesIndex = 0;
+ lineChart.series = [];
+ label = "";
+ }
+ xaxis = lineChart.xAxis[0];
+ xaxis.categories = [];
+ if (settings.xaxisformat) {
+ xaxis.labels.formatter = new Function(settings.xaxisformat);
+ }
+ if (settings.step) {
+ xaxis.labels.step = settings.step;
+ }
+ for (var i = 0; i < dPLength; i++) {
+ var dp = dataPoints[i];
+ xaxis.categories.push(dp.timestamp);
+ }
+ if (chartData.length > 1) {
+ for (var l = 0; l < chartData.length; l++) {
+ if (chartData[l].chartGroupName) {
+ dataPoints = chartData[l].datapoints;
+ lineChart.series[l] = {};
+ lineChart.series[l].data = [];
+ lineChart.series[l].name = chartData[l].chartGroupName;
+ lineChart.series[l].yAxis = 0;
+ lineChart.series[l].type = "line";
+ lineChart.series[l].color = dataDescription.colors[i];
+ lineChart.series[l].dashStyle = "solid";
+ lineChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
+ plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
+ }
+ }
+ } else {
+ var steadyCounter = 0;
+ for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
+ var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
+ lineChart.series[i] = {};
+ lineChart.series[i].data = [];
+ lineChart.series[i].name = label + dataDescription.labels[steadyCounter];
+ lineChart.series[i].yAxis = yAxisIndex;
+ lineChart.series[i].type = "line";
+ lineChart.series[i].color = dataDescription.colors[i];
+ lineChart.series[i].dashStyle = "solid";
+ lineChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
+ steadyCounter++;
+ }
+ plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
+ }
+ function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
+ for (var i = 0; i < dPLength; i++) {
+ var dp = dataPoints[i];
+ var localCounter = counter;
+ for (var j = 0; j < dataAttrs.length; j++) {
+ if (typeof dp === "undefined") {
+ lineChart.series[localCounter].data.push([ i, 0 ]);
+ } else {
+ lineChart.series[localCounter].data.push([ i, dp[dataAttrs[j]] ]);
+ }
+ if (!detailedView) {
+ localCounter++;
+ }
+ }
+ }
+ }
+ return lineChart;
+ },
+ convertAreaChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+ areaChart = angular.copy(areaChart);
+ if (typeof chartData[0] === "undefined") {
+ chartData[0] = {};
+ chartData[0].datapoints = [];
+ }
+ var dataPoints = chartData[0].datapoints, dPLength = dataPoints.length, label;
+ if (currentCompare === "YESTERDAY") {
+ seriesIndex = dataDescription.dataAttr.length;
+ label = "Yesterday ";
+ } else if (currentCompare === "LAST_WEEK") {
+ seriesIndex = dataDescription.dataAttr.length;
+ label = "Last Week ";
+ } else {
+ areaChart = chartTemplate;
+ seriesIndex = 0;
+ areaChart.series = [];
+ label = "";
+ }
+ xaxis = areaChart.xAxis[0];
+ xaxis.categories = [];
+ if (settings.xaxisformat) {
+ xaxis.labels.formatter = new Function(settings.xaxisformat);
+ }
+ if (settings.step) {
+ xaxis.labels.step = settings.step;
+ }
+ for (var i = 0; i < dPLength; i++) {
+ var dp = dataPoints[i];
+ xaxis.categories.push(dp.timestamp);
+ }
+ if (chartData.length > 1) {
+ for (var l = 0; l < chartData.length; l++) {
+ if (chartData[l].chartGroupName) {
+ dataPoints = chartData[l].datapoints;
+ areaChart.series[l] = {};
+ areaChart.series[l].data = [];
+ areaChart.series[l].fillColor = dataDescription.areaColors[l];
+ areaChart.series[l].name = chartData[l].chartGroupName;
+ areaChart.series[l].yAxis = 0;
+ areaChart.series[l].type = "area";
+ areaChart.series[l].pointInterval = 1;
+ areaChart.series[l].color = dataDescription.colors[l];
+ areaChart.series[l].dashStyle = "solid";
+ areaChart.series[l].yAxis.title.text = dataDescription.yAxisLabels;
+ plotData(l, dPLength, dataPoints, dataDescription.detailDataAttr, true);
+ }
+ }
+ } else {
+ var steadyCounter = 0;
+ for (var i = seriesIndex; i < dataDescription.dataAttr.length + (seriesIndex > 0 ? seriesIndex : 0); i++) {
+ var yAxisIndex = dataDescription.multiAxis ? steadyCounter : 0;
+ areaChart.series[i] = {};
+ areaChart.series[i].data = [];
+ areaChart.series[i].fillColor = dataDescription.areaColors[i];
+ areaChart.series[i].name = label + dataDescription.labels[steadyCounter];
+ areaChart.series[i].yAxis = yAxisIndex;
+ areaChart.series[i].type = "area";
+ areaChart.series[i].pointInterval = 1;
+ areaChart.series[i].color = dataDescription.colors[i];
+ areaChart.series[i].dashStyle = "solid";
+ areaChart.yAxis[yAxisIndex].title.text = dataDescription.yAxisLabels[dataDescription.yAxisLabels > 1 ? steadyCounter : 0];
+ steadyCounter++;
+ }
+ plotData(seriesIndex, dPLength, dataPoints, dataDescription.dataAttr, false);
+ }
+ function plotData(counter, dPLength, dataPoints, dataAttrs, detailedView) {
+ for (var i = 0; i < dPLength; i++) {
+ var dp = dataPoints[i];
+ var localCounter = counter;
+ for (var j = 0; j < dataAttrs.length; j++) {
+ if (typeof dp === "undefined") {
+ areaChart.series[localCounter].data.push(0);
+ } else {
+ areaChart.series[localCounter].data.push(dp[dataAttrs[j]]);
+ }
+ if (!detailedView) {
+ localCounter++;
+ }
+ }
+ }
+ }
+ return areaChart;
+ },
+ convertParetoChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+ paretoChart = chartTemplate;
+ if (typeof chartData === "undefined") {
+ chartData = [];
+ }
+ var label, cdLength = chartData.length, compare = false, allParetoOptions = [], stackedBar = false;
+ seriesIndex = 0;
+ function getPreviousData() {
+ for (var i = 0; i < chartTemplate.series[0].data.length; i++) {
+ allParetoOptions.push(chartTemplate.xAxis.categories[i]);
+ }
+ }
+ if (typeof dataDescription.dataAttr[1] === "object") {
+ stackedBar = true;
+ }
+ if (currentCompare === "YESTERDAY") {
+ label = "Yesterday ";
+ compare = true;
+ if (stackedBar) {
+ seriesIndex = dataDescription.dataAttr[1].length;
+ }
+ getPreviousData();
+ } else if (currentCompare === "LAST_WEEK") {
+ label = "Last Week ";
+ compare = true;
+ if (stackedBar) {
+ seriesIndex = dataDescription.dataAttr[1].length;
+ }
+ seriesIndex = getPreviousData();
+ } else {
+ compare = false;
+ label = "";
+ paretoChart.xAxis.categories = [];
+ paretoChart.series = [];
+ paretoChart.series[0] = {};
+ paretoChart.series[0].data = [];
+ paretoChart.legend.enabled = false;
+ }
+ paretoChart.plotOptions.series.borderColor = dataDescription.borderColor;
+ if (compare && !stackedBar) {
+ paretoChart.series[1] = {};
+ paretoChart.series[1].data = [];
+ for (var i = 0; i < allParetoOptions.length; i++) {
+ paretoChart.series[1].data.push(0);
+ }
+ paretoChart.legend.enabled = true;
+ }
+ for (var i = 0; i < cdLength; i++) {
+ var bar = chartData[i];
+ if (!compare) {
+ paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]);
+ if (typeof dataDescription.dataAttr[1] === "object") {
+ createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
+ } else {
+ paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]);
+ paretoChart.series[0].name = dataDescription.labels[0];
+ paretoChart.series[0].color = dataDescription.colors[0];
+ }
+ } else {
+ var newLabel = bar[dataDescription.dataAttr[0]], newValue = bar[dataDescription.dataAttr[1]], previousIndex = allParetoOptions.indexOf(newLabel);
+ if (previousIndex > -1) {
+ if (typeof dataDescription.dataAttr[1] === "object") {
+ createStackedBar(dataDescription, paretoChart, paretoChart.series.length);
+ } else {
+ paretoChart.series[1].data[previousIndex] = newValue;
+ paretoChart.series[1].name = label !== "" ? label + " " + dataDescription.labels[0] : dataDescription.labels[0];
+ paretoChart.series[1].color = dataDescription.colors[1];
+ }
+ } else {}
+ }
+ }
+ function createStackedBar(dataDescription, paretoChart, startingPoint) {
+ paretoChart.plotOptions = {
+ series: {
+ shadow: false,
+ borderColor: dataDescription.borderColor,
+ borderWidth: 1
+ },
+ column: {
+ stacking: "normal",
+ dataLabels: {
+ enabled: true,
+ color: Highcharts.theme && Highcharts.theme.dataLabelsColor || "white"
+ }
+ }
+ };
+ var start = dataDescription.dataAttr[1].length, steadyCounter = 0, stackName = label;
+ if (compare) {
+ paretoChart.legend.enabled = true;
+ }
+ for (var f = seriesIndex; f < start + seriesIndex; f++) {
+ if (!paretoChart.series[f]) {
+ paretoChart.series[f] = {
+ data: []
+ };
+ }
+ paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]);
+ paretoChart.series[f].name = label !== "" ? label + " " + dataDescription.labels[steadyCounter] : dataDescription.labels[steadyCounter];
+ paretoChart.series[f].color = dataDescription.colors[f];
+ paretoChart.series[f].stack = label;
+ steadyCounter++;
+ }
+ }
+ return paretoChart;
+ },
+ convertPieChart: function(chartData, chartTemplate, dataDescription, settings, currentCompare) {
+ var label, cdLength = chartData.length, compare = false;
+ pieChart = chartTemplate;
+ if (currentCompare === "YESTERDAY") {
+ label = "Yesterday ";
+ compare = false;
+ } else if (currentCompare === "LAST_WEEK") {
+ label = "Last Week ";
+ compare = false;
+ } else {
+ compare = false;
+ pieChart.series[0].data = [];
+ if (pieChart.series[0].dataLabels) {
+ if (typeof pieChart.series[0].dataLabels.formatter === "string") {
+ pieChart.series[0].dataLabels.formatter = new Function(pieChart.series[0].dataLabels.formatter);
+ }
+ }
+ }
+ pieChart.plotOptions.pie.borderColor = dataDescription.borderColor;
+ if (compare) {
+ pieChart.series[1].data = [];
+ if (pieChart.series[1].dataLabels) {
+ if (typeof pieChart.series[1].dataLabels.formatter === "string") {
+ pieChart.series[1].dataLabels.formatter = new Function(pieChart.series[1].dataLabels.formatter);
+ }
+ }
+ }
+ var tempArray = [];
+ for (var i = 0; i < cdLength; i++) {
+ var pie = chartData[i];
+ tempArray.push({
+ name: pie[dataDescription.dataAttr[0]],
+ y: pie[dataDescription.dataAttr[1]],
+ color: ""
+ });
+ }
+ sortJsonArrayByProperty(tempArray, "name");
+ for (var i = 0; i < tempArray.length; i++) {
+ tempArray[i].color = dataDescription.colors[i];
+ }
+ if (!compare) {
+ pieChart.series[0].data = tempArray;
+ } else {
+ pieChart.series[1].data = tempArray;
+ }
+ return pieChart;
+ }
+ };
+ function sortJsonArrayByProperty(objArray, prop, direction) {
+ if (arguments.length < 2) throw new Error("sortJsonArrayByProp requires 2 arguments");
+ var direct = arguments.length > 2 ? arguments[2] : 1;
+ if (objArray && objArray.constructor === Array) {
+ var propPath = prop.constructor === Array ? prop : prop.split(".");
+ objArray.sort(function(a, b) {
+ for (var p in propPath) {
+ if (a[propPath[p]] && b[propPath[p]]) {
+ a = a[propPath[p]];
+ b = b[propPath[p]];
+ }
+ }
+ a = a.match(/^\d+$/) ? +a : a;
+ b = b.match(/^\d+$/) ? +b : b;
+ return a < b ? -1 * direct : a > b ? 1 * direct : 0;
+ });
+ }
+ }
+ });
+ $(".sessions-bar").sparkline([ 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 4, 3, 5, 6, 3, 4, 5, 6, 7, 8, 1 ], {
+ type: "bar",
+ barColor: "#c5c5c5",
+ width: "800px",
+ height: 100,
+ barWidth: 12,
+ barSpacing: "1px"
+ });
+ "use strict";
+ AppServices.Controllers.controller("DataCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
+ var init = function() {
+ $scope.verb = "GET";
+ $scope.display = "";
+ $scope.queryBodyDetail = {};
+ $scope.queryBodyDisplay = "none";
+ $scope.queryLimitDisplay = "block";
+ $scope.queryStringDisplay = "block";
+ $scope.entitySelected = {};
+ $scope.newCollection = {};
+ $rootScope.queryCollection = {};
+ $scope.data = {};
+ $scope.data.queryPath = "";
+ $scope.data.queryBody = '{ "name":"value" }';
+ $scope.data.searchString = "";
+ $scope.data.queryLimit = "";
+ };
+ var runQuery = function(verb) {
+ $scope.loading = true;
+ var queryPath = $scope.removeFirstSlash($scope.data.queryPath || "");
+ var searchString = $scope.data.searchString || "";
+ var queryLimit = $scope.data.queryLimit || "";
+ var body = JSON.parse($scope.data.queryBody || "{}");
+ if (verb == "POST" && $scope.validateJson(true)) {
+ ug.runDataPOSTQuery(queryPath, body);
+ } else if (verb == "PUT" && $scope.validateJson(true)) {
+ ug.runDataPutQuery(queryPath, searchString, queryLimit, body);
+ } else if (verb == "DELETE") {
+ ug.runDataDeleteQuery(queryPath, searchString, queryLimit);
+ } else {
+ ug.runDataQuery(queryPath, searchString, queryLimit);
+ }
+ };
+ $scope.$on("top-collections-received", function(event, collectionList) {
+ $scope.loading = false;
+ var ignoredCollections = [ "events" ];
+ ignoredCollections.forEach(function(ignoredCollection) {
+ collectionList.hasOwnProperty(ignoredCollection) && delete collectionList[ignoredCollection];
+ });
+ $scope.collectionList = collectionList;
+ $scope.queryBoxesSelected = false;
+ if (!$scope.queryPath) {
+ $scope.loadCollection("/" + collectionList[Object.keys(collectionList).sort()[0]].name);
+ }
+ $scope.applyScope();
+ });
+ $scope.$on("error-running-query", function(event) {
+ $scope.loading = false;
+ runQuery("GET");
+ $scope.applyScope();
+ });
+ $scope.$on("entity-deleted", function(event) {
+ $scope.deleteLoading = false;
+ $rootScope.$broadcast("alert", "success", "Entities deleted sucessfully");
+ $scope.queryBoxesSelected = false;
+ $scope.checkNextPrev();
+ $scope.applyScope();
+ });
+ $scope.$on("entity-deleted-error", function(event) {
+ $scope.deleteLoading = false;
+ runQuery("GET");
+ $scope.applyScope();
+ });
+ $scope.$on("collection-created", function() {
+ $scope.newCollection.name = "";
+ });
+ $scope.$on("query-received", function(event, collection) {
+ $scope.loading = false;
+ $rootScope.queryCollection = collection;
+ ug.getIndexes($scope.data.queryPath);
+ $scope.setDisplayType();
+ $scope.checkNextPrev();
+ $scope.applyScope();
+ $scope.queryBoxesSelected = false;
+ });
+ $scope.$on("indexes-received", function(event, indexes) {
+ var fred = indexes;
+ });
+ $scope.$on("app-changed", function() {
+ init();
+ });
+ $scope.setDisplayType = function() {
+ $scope.display = "generic";
+ };
+ $scope.deleteEntitiesDialog = function(modalId) {
+ $scope.deleteLoading = false;
+ $scope.deleteEntities($rootScope.queryCollection, "entity-deleted", "error deleting entity");
+ $scope.hideModal(modalId);
+ };
+ $scope.newCollectionDialog = function(modalId) {
+ if ($scope.newCollection.name) {
+ ug.createCollection($scope.newCollection.name);
+ ug.getTopCollections();
+ $rootScope.$broadcast("alert", "success", "Collection created successfully.");
+ $scope.hideModal(modalId);
+ } else {
+ $rootScope.$broadcast("alert", "error", "You must specify a collection name.");
+ }
+ };
+ $scope.addToPath = function(uuid) {
+ $scope.data.queryPath = "/" + $rootScope.queryCollection._type + "/" + uuid;
+ };
+ $scope.isDeep = function(item) {
+ return Object.prototype.toString.call(item) === "[object Object]";
+ };
+ $scope.loadCollection = function(type) {
+ $scope.data.queryPath = "/" + type.substring(1, type.length);
+ $scope.data.searchString = "";
+ $scope.data.queryLimit = "";
+ $scope.data.body = '{ "name":"value" }';
+ $scope.selectGET();
+ $scope.applyScope();
+ $scope.run();
+ };
+ $scope.selectGET = function() {
+ $scope.queryBodyDisplay = "none";
+ $scope.queryLimitDisplay = "block";
+ $scope.queryStringDisplay = "block";
+ $scope.verb = "GET";
+ };
+ $scope.selectPOST = function() {
+ $scope.queryBodyDisplay = "block";
+ $scope.queryLimitDisplay = "none";
+ $scope.queryStringDisplay = "none";
+ $scope.verb = "POST";
+ };
+ $scope.selectPUT = function() {
+ $scope.queryBodyDisplay = "block";
+ $scope.queryLimitDisplay = "block";
+ $scope.queryStringDisplay = "block";
+ $scope.verb = "PUT";
+ };
+ $scope.selectDELETE = function() {
+ $scope.queryBodyDisplay = "none";
+ $scope.queryLimitDisplay = "block";
+ $scope.queryStringDisplay = "block";
+ $scope.verb = "DELETE";
+ };
+ $scope.validateJson = function(skipMessage) {
+ var queryBody = $scope.data.queryBody;
+ try {
+ queryBody = JSON.parse(queryBody);
+ } catch (e) {
+ $rootScope.$broadcast("alert", "error", "JSON is not valid");
+ return false;
+ }
+ queryBody = JSON.stringify(queryBody, null, 2);
+ !skipMessage && $rootScope.$broadcast("alert", "success", "JSON is valid");
+ $scope.data.queryBody = queryBody;
+ return true;
+ };
+ $scope.saveEntity = function(entity) {
+ if (!$scope.validateJson()) {
+ return false;
+ }
+ var queryBody = entity._json;
+ queryBody = JSON.parse(queryBody);
+ $rootScope.selectedEntity.set();
+ $rootScope.selectedEntity.set(queryBody);
+ $rootScope.selectedEntity.set("type", entity._data.type);
+ $rootScope.selectedEntity.set("uuid", entity._data.uuid);
+ $rootScope.selectedEntity.save(function(err, data) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
+ } else {
+ $rootScope.$broadcast("alert", "success", "entity saved");
+ }
+ });
+ };
+ $scope.run = function() {
+ $rootScope.queryCollection = "";
+ var verb = $scope.verb;
+ runQuery(verb);
+ };
+ $scope.hasProperty = function(prop) {
+ var retval = false;
+ if (typeof $rootScope.queryCollection._list !== "undefined") {
+ angular.forEach($rootScope.queryCollection._list, function(value, key) {
+ if (!retval) {
+ if (value._data[prop]) {
+ retval = true;
+ }
+ }
+ });
+ }
+ return retval;
+ };
+ $scope.resetNextPrev = function() {
+ $scope.previous_display = "none";
+ $scope.next_display = "none";
+ };
+ $scope.checkNextPrev = function() {
+ $scope.resetNextPrev();
+ if ($rootScope.queryCollection.hasPreviousPage()) {
+ $scope.previous_display = "default";
+ }
+ if ($rootScope.queryCollection.hasNextPage()) {
+ $scope.next_display = "default";
+ }
+ };
+ $scope.selectEntity = function(uuid) {
+ $rootScope.selectedEntity = $rootScope.queryCollection.getEntityByUUID(uuid);
+ $scope.addToPath(uuid);
+ };
+ $scope.getJSONView = function(entity) {
+ var tempjson = entity.get();
+ var queryBody = JSON.stringify(tempjson, null, 2);
+ queryBody = JSON.parse(queryBody);
+ delete queryBody.metadata;
+ delete queryBody.uuid;
+ delete queryBody.created;
+ delete queryBody.modified;
+ delete queryBody.type;
+ $scope.queryBody = JSON.stringify(queryBody, null, 2);
+ };
+ $scope.getPrevious = function() {
+ $rootScope.queryCollection.getPreviousPage(function(err) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error getting previous page of data");
+ }
+ $scope.checkNextPrev();
+ $scope.applyScope();
+ });
+ };
+ $scope.getNext = function() {
+ $rootScope.queryCollection.getNextPage(function(err) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error getting next page of data");
+ }
+ $scope.checkNextPrev();
+ $scope.applyScope();
+ });
+ };
+ init();
+ $rootScope.queryCollection = $rootScope.queryCollection || {};
+ $rootScope.selectedEntity = {};
+ if ($rootScope.queryCollection && $rootScope.queryCollection._type) {
+ $scope.loadCollection($rootScope.queryCollection._type);
+ $scope.setDisplayType();
+ }
+ ug.getTopCollections();
+ $scope.resetNextPrev();
+ } ]);
+ "use strict";
+ AppServices.Controllers.controller("EntityCtrl", [ "ug", "$scope", "$rootScope", "$location", function(ug, $scope, $rootScope, $location) {
+ if (!$rootScope.selectedEntity) {
+ $location.path("/data");
+ return;
+ }
+ $scope.entityUUID = $rootScope.selectedEntity.get("uuid");
+ $scope.entityType = $rootScope.selectedEntity.get("type");
+ var tempjson = $rootScope.selectedEntity.get();
+ var queryBody = JSON.stringify(tempjson, null, 2);
+ queryBody = JSON.parse(queryBody);
+ delete queryBody.metadata;
+ delete queryBody.uuid;
+ delete queryBody.created;
+ delete queryBody.modified;
+ delete queryBody.type;
+ $scope.queryBody = JSON.stringify(queryBody, null, 2);
+ $scope.validateJson = function() {
+ var queryBody = $scope.queryBody;
+ try {
+ queryBody = JSON.parse(queryBody);
+ } catch (e) {
+ $rootScope.$broadcast("alert", "error", "JSON is not valid");
+ return false;
+ }
+ queryBody = JSON.stringify(queryBody, null, 2);
+ $rootScope.$broadcast("alert", "success", "JSON is valid");
+ $scope.queryBody = queryBody;
+ return true;
+ };
+ $scope.saveEntity = function() {
+ if (!$scope.validateJson()) {
+ return false;
+ }
+ var queryBody = $scope.queryBody;
+ queryBody = JSON.parse(queryBody);
+ $rootScope.selectedEntity.set();
+ $rootScope.selectedEntity.set(queryBody);
+ $rootScope.selectedEntity.set("type", $scope.entityType);
+ $rootScope.selectedEntity.set("uuid", $scope.entityUUID);
+ $rootScope.selectedEntity.save(function(err, data) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error: " + data.error_description);
+ } else {
+ $rootScope.$broadcast("alert", "success", "entity saved");
+ }
+ });
+ };
+ } ]);
+ "use strict";
+ AppServices.Directives.directive("balloon", [ "$window", "$timeout", function($window, $timeout) {
+ return {
+ restrict: "ECA",
+ scope: "=",
+ template: "" + '<div class="baloon {{direction}}" ng-transclude>' + "</div>",
+ replace: true,
+ transclude: true,
+ link: function linkFn(scope, lElement, attrs) {
+ scope.direction = attrs.direction;
+ var runScroll = true;
+ var windowEl = angular.element($window);
+ windowEl.on("scroll", function() {
+ if (runScroll) {
+ lElement.addClass("fade-out");
+ $timeout(function() {
+ lElement.addClass("hide");
+ }, 1e3);
+ runScroll = false;
+ }
+ });
+ }
+ };
+ } ]);
+ "use strict";
+ AppServices.Directives.directive("bsmodal", [ "$rootScope", function($rootScope) {
+ return {
+ restrict: "ECA",
+ scope: {
+ title: "@title",
+ buttonid: "=buttonid",
+ footertext: "=footertext",
+ closelabel: "=closelabel"
+ },
+ transclude: true,
+ templateUrl: "dialogs/modal.html",
+ replace: true,
+ link: function linkFn(scope, lElement, attrs, parentCtrl) {
+ scope.title = attrs.title;
+ scope.footertext = attrs.footertext;
+ scope.closelabel = attrs.closelabel;
+ scope.close = attrs.close;
+ scope.extrabutton = attrs.extrabutton;
+ scope.extrabuttonlabel = attrs.extrabuttonlabel;
+ scope.buttonId = attrs.buttonid;
+ scope.closeDelegate = function(attr) {
+ scope.$parent[attr](attrs.id, scope);
+ };
+ scope.extraDelegate = function(attr) {
+ if (scope.dialogForm.$valid) {
+ console.log(parentCtrl);
+ scope.$parent[attr](attrs.id);
+ } else {
+ $rootScope.$broadcast("alert", "error", "Please check your form input and resubmit.");
+ }
+ };
+ }
+ };
+ } ]);
+ "use strict";
+ AppServices.Controllers.controller("AlertCtrl", [ "$scope", "$rootScope", "$timeout", function($scope, $rootScope, $timeout) {
+ $scope.alertDisplay = "none";
+ $scope.alerts = [];
+ $scope.$on("alert", function(event, type, message, permanent) {
+ $scope.addAlert(type, message, permanent);
+ });
+ $scope.$on("clear-alerts", function(event, message) {
+ $scope.alerts = [];
+ });
+ $scope.addAlert = function(type, message, permanent) {
+ $scope.alertDisplay = "block";
+ $scope.alerts.push({
+ type: type,
+ msg: message
+ });
+ $scope.applyScope();
+ if (!permanent) {
+ $timeout(function() {
+ $scope.alerts.shift();
+ }, 5e3);
+ }
+ };
+ $scope.closeAlert = function(index) {
+ $scope.alerts.splice(index, 1);
+ };
+ } ]);
+ "use strict";
+ AppServices.Directives.directive("alerti", [ "$rootScope", "$timeout", function($rootScope, $timeout) {
+ return {
+ restrict: "ECA",
+ scope: {
+ type: "=type",
+ closeable: "@closeable",
+ index: "&index"
+ },
+ template: '<div class="alert" ng-class="type && \'alert-\' + type">' + ' <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">×</button>' + ' <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">💥</i>' + ' <i ng-if="type === \'info\'" class="pictogram pull-left">ℹ</i>' + ' <i ng-if="type === \'error\'" class="pictogram pull-left">⚡</i>' + ' <i ng-if="type === \'success\'" class="pictogram pull-left">👍</i>' + "<div ng-transclude></div>" + "</div>",
+ replace: true,
+ transclude: true,
+ link: function linkFn(scope, lElement, attrs) {
+ $timeout(function() {
+ lElement.addClass("fade-out");
+ }, 4e3);
+ lElement.click(function() {
+ if (attrs.index) {
+ scope.$parent.closeAlert(attrs.index);
+ }
+ });
+ setTimeout(function() {
+ lElement.addClass("alert-animate");
+ }, 10);
+ }
+ };
+ } ]);
+ "use strict";
+ AppServices.Directives.directive("appswitcher", [ "$rootScope", function($rootScope) {
+ return {
+ restrict: "ECA",
+ scope: "=",
+ templateUrl: "global/appswitcher-template.html",
+ replace: true,
+ transclude: true,
+ link: function linkFn(scope, lElement, attrs) {
+ var classNameOpen = "open";
+ $("ul.nav li.dropdownContainingSubmenu").hover(function() {
+ $(this).addClass(classNameOpen);
+ }, function() {
+ $(this).removeClass(classNameOpen);
+ });
+ $("#globalNav > a").mouseover(globalNavDetail);
+ $("#globalNavDetail").mouseover(globalNavDetail);
+ $("#globalNavSubmenuContainer ul li").mouseover(function() {
+ $("#globalNavDetail > div").removeClass(classNameOpen);
+ $("#" + this.getAttribute("data-globalNavDetail")).addClass(classNameOpen);
+ });
+ function globalNavDetail() {
+ $("#globalNavDetail > div").removeClass(classNameOpen);
+ $("#globalNavDetailApiPlatform").addClass(classNameOpen);
+ }
+ }
+ };
+ } ]);
+ "use strict";
+ AppServices.Services.factory("help", function($rootScope, $http, $analytics) {
+ $rootScope.help = {};
+ $rootScope.help.helpButtonStatus = "Enable Help";
+ $rootScope.help.helpTooltipsEnabled = false;
+ $rootScope.help.clicked = false;
+ $rootScope.help.showHelpButtons = false;
+ var tooltipStartTime;
+ var helpStartTime;
+ var introjs_step;
+ $rootScope.help.sendTooltipGA = function(tooltipName) {
+ $analytics.eventTrack("tooltip - " + $rootScope.currentPath, {
+ category: "App Services",
+ label: tooltipName
+ });
+ };
+ $rootScope.help.toggleTooltips = function() {
+ if ($rootScope.help.helpTooltipsEnabled == false) {
+ $rootScope.help.helpButtonStatus = "Disable Help";
+ $rootScope.help.helpTooltipsEnabled = true;
+ showHelpModal("tooltips");
+ } else {
+ $rootScope.help.helpButtonStatus = "Enable Help";
+ $rootScope.help.helpTooltipsEnabled = false;
+ }
+ };
+ $rootScope.help.IntroOptions = {
+ steps: [],
+ showStepNumbers: false,
+ exitOnOverlayClick: true,
+ exitOnEsc: true,
+ nextLabel: "Next",
+ prevLabel: "Back",
+ skipLabel: "Exit",
+ doneLabel: "Done"
+ };
+ $rootScope.$on("$routeChangeSuccess", function(event, current) {
+ var path = current.$$route ? current.$$route.originalPath : null;
+ if (path == "/org-overview") {
+ $rootScope.help.showHelpButtons = true;
+ getHelpJson(path).success(function(json) {
+ var helpJson = json;
+ setHelpStrings(helpJson);
+ showHelpModal("tour");
+ });
+ } else {
+ $rootScope.help.showHelpButtons = false;
+ }
+ });
+ var showHelpModal = function(helpType) {
+ var shouldHelp = location.search.indexOf("noHelp") <= 0;
+ if (helpType == "tour" && !getHelpStatus(helpType)) {
+ shouldHelp && $rootScope.showModal("introjs");
+ } else if (helpType == "tooltips" && !getHelpStatus(helpType)) {
+ shouldHelp && $rootScope.showModal("tooltips");
+ }
+ };
+ var setHelpStrings = function(helpJson) {
+ $rootScope.help.IntroOptions.steps = helpJson.introjs;
+ angular.forEach(helpJson.tooltip, function(value, binding) {
+ $rootScope[binding] = value;
+ });
+ };
+ $rootScope.help.introjs_StartEvent = function() {
+ helpStartTime = Date.now();
+ introjs_step = 1;
+ };
+ $rootScope.help.introjs_ExitEvent = function() {
+ var introjs_time = Math.round((Date.now() - helpStartTime) / 1e3);
+ $analytics.eventTrack("introjs timing - " + $rootScope.currentPath, {
+ category: "App Services",
+ label: introjs_time + "s"
+ });
+ $analytics.eventTrack("introjs exit - " + $rootScope.currentPath, {
+ category: "App Services",
+ label: "step" + introjs_step
+ });
+ };
+ $rootScope.help.introjs_ChangeEvent = function() {
+ introjs_step++;
+ };
+ var getHelpJson = function(path) {
- return $http.jsonp("http://sdk.apigee.com.s3.amazonaws.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
++ return $http.jsonp("https://s3.amazonaws.com/sdk.apigee.com/portal_help" + path + "/helpJson.json?callback=JSON_CALLBACK");
+ };
+ var getHelpStatus = function(helpType) {
+ var status;
+ if (helpType == "tour") {
+ status = localStorage.getItem("ftu_tour");
+ localStorage.setItem("ftu_tour", "false");
+ } else if (helpType == "tooltips") {
+ status = localStorage.getItem("ftu_tooltips");
+ localStorage.setItem("ftu_tooltips", "false");
+ }
+ return status;
+ };
+ });
+ AppServices.Directives.directive("insecureBanner", [ "$rootScope", "ug", function($rootScope, ug) {
+ return {
+ restrict: "E",
+ transclude: true,
+ templateUrl: "global/insecure-banner.html",
+ link: function linkFn(scope, lElement, attrs) {
+ scope.securityWarning = false;
+ scope.$on("roles-received", function(evt, roles) {
+ scope.securityWarning = false;
+ if (!roles || !roles._list) return;
+ roles._list.forEach(function(roleHolder) {
+ var role = roleHolder._data;
+ if (role.name.toUpperCase() === "GUEST") {
+ roleHolder.getPermissions(function(err, data) {
+ if (!err) {
+ if (roleHolder.permissions) {
+ roleHolder.permissions.forEach(function(permission) {
+ if (permission.path.indexOf("/**") >= 0) {
+ scope.securityWarning = true;
+ scope.applyScope();
+ }
+ });
+ }
+ }
+ });
+ }
+ });
+ });
+ var initialized = false;
+ scope.$on("app-initialized", function() {
+ !initialized && ug.getRoles();
+ initialized = true;
+ });
+ scope.$on("app-changed", function() {
+ scope.securityWarning = false;
+ ug.getRoles();
+ });
+ }
+ };
+ } ]);
+ "use strict";
+ AppServices.Constants.constant("configuration", {
+ ITEMS_URL: "global/temp.json"
+ });
+ "use strict";
+ AppServices.Controllers.controller("PageCtrl", [ "ug", "help", "utility", "$scope", "$rootScope", "$location", "$routeParams", "$q", "$route", "$log", "$analytics", function(ug, help, utility, $scope, $rootScope, $location, $routeParams, $q, $route, $log, $analytics) {
+ var initScopeVariables = function() {
+ $scope.loadingText = "Loading...";
+ $scope.use_sso = false;
+ $scope.newApp = {
+ name: ""
+ };
+ $scope.getPerm = "";
+ $scope.postPerm = "";
+ $scope.putPerm = "";
+ $scope.deletePerm = "";
+ $scope.usersTypeaheadValues = [];
+ $scope.groupsTypeaheadValues = [];
+ $scope.rolesTypeaheadValues = [];
+ $rootScope.sdkActive = false;
+ $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];
+ }
+ $scope.options = Usergrid.options;
+ var getQuery = function() {
+ var result = {}, queryString = location.search.slice(1), re = /([^&=]+)=([^&]*)/g, m;
+ while (m = re.exec(queryString)) {
+ result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
+ }
+ return result;
+ };
+ $scope.queryString = getQuery();
+ };
+ initScopeVariables();
+ $rootScope.urls = function() {
+ var urls = ug.getUrls($scope.queryString);
+ $scope.apiUrl = urls.apiUrl;
+ $scope.use_sso = urls.use_sso;
+ return urls;
+ };
+ $rootScope.gotoPage = function(path) {
+ $location.path(path);
+ };
+ var notRegistration = function() {
+ return "/forgot-password" !== $location.path() && "/register" !== $location.path();
+ };
+ var verifyUser = function() {
+ if ($location.path().slice(0, "/login".length) !== "/login") {
+ $rootScope.currentPath = $location.path();
+ }
+ if ($routeParams.access_token && $routeParams.admin_email && $routeParams.uuid) {
+ ug.set("token", $routeParams.access_token);
+ ug.set("email", $routeParams.admin_email);
+ ug.set("uuid", $routeParams.uuid);
+ $location.search("access_token", null);
+ $location.search("admin_email", null);
+ $location.search("uuid", null);
+ }
+ ug.checkAuthentication(true);
+ };
+ $scope.profile = function() {
+ if ($scope.use_sso) {
+ window.location = $rootScope.urls().PROFILE_URL + "?callback=" + encodeURIComponent($location.absUrl());
+ } else {
+ $location.path("/profile");
+ }
+ };
+ $rootScope.showModal = function(id) {
+ $("#" + id).modal("show");
+ };
+ $rootScope.hideModal = function(id) {
+ $("#" + id).modal("hide");
+ };
+ $scope.deleteEntities = function(collection, successBroadcast, errorMessage) {
+ collection.resetEntityPointer();
+ var entitiesToDelete = [];
+ while (collection.hasNextEntity()) {
+ var entity = collection.getNextEntity();
+ var checked = entity.checked;
+ if (checked) {
+ entitiesToDelete.push(entity);
+ }
+ }
+ var count = 0, success = false;
+ for (var i = 0; i < entitiesToDelete.length; i++) {
+ var entity = entitiesToDelete[i];
+ collection.destroyEntity(entity, function(err) {
+ count++;
+ if (err) {
+ $rootScope.$broadcast("alert", "error", errorMessage);
+ $rootScope.$broadcast(successBroadcast + "-error", err);
+ } else {
+ success = true;
+ }
+ if (count === entitiesToDelete.length) {
+ success && $rootScope.$broadcast(successBroadcast);
+ $scope.applyScope();
+ }
+ });
+ }
+ };
+ $scope.selectAllEntities = function(list, that, varName, setValue) {
+ varName = varName || "master";
+ var val = that[varName];
+ if (setValue == undefined) {
+ setValue = true;
+ }
+ if (setValue) {
+ that[varName] = val = !val;
+ }
+ list.forEach(function(entitiy) {
+ entitiy.checked = val;
+ });
+ };
+ $scope.createPermission = function(type, entity, path, permissions) {
+ if (path.charAt(0) != "/") {
+ path = "/" + path;
+ }
+ var ops = "";
+ var s = "";
+ if (permissions.getPerm) {
+ ops = "get";
+ s = ",";
+ }
+ if (permissions.postPerm) {
+ ops = ops + s + "post";
+ s = ",";
+ }
+ if (permissions.putPerm) {
+ ops = ops + s + "put";
+ s = ",";
+ }
+ if (permissions.deletePerm) {
+ ops = ops + s + "delete";
+ s = ",";
+ }
+ var permission = ops + ":" + path;
+ return permission;
+ };
+ $scope.formatDate = function(date) {
+ return new Date(date).toUTCString();
+ };
+ $scope.clearCheckbox = function(id) {
+ if ($("#" + id).attr("checked")) {
+ $("#" + id).click();
+ }
+ };
+ $scope.removeFirstSlash = function(path) {
+ return path.indexOf("/") === 0 ? path.substring(1, path.length) : path;
+ };
+ $scope.applyScope = function(cb) {
+ cb = typeof cb === "function" ? cb : function() {};
+ if (!this.$$phase) {
+ return this.$apply(cb);
+ } else {
+ cb();
+ }
+ };
+ $scope.valueSelected = function(list) {
+ return list && list.some(function(item) {
+ return item.checked;
+ });
+ };
+ $scope.sendHelp = function(modalId) {
+ ug.jsonpRaw("apigeeuihelpemail", "", {
+ useremail: $rootScope.userEmail
+ }).then(function() {
+ $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
+ }, function() {
+ $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
+ });
+ $scope.hideModal(modalId);
+ };
+ $scope.$on("users-typeahead-received", function(event, users) {
+ $scope.usersTypeaheadValues = users;
+ if (!$scope.$$phase) {
+ $scope.$apply();
+ }
+ });
+ $scope.$on("groups-typeahead-received", function(event, groups) {
+ $scope.groupsTypeaheadValues = groups;
+ if (!$scope.$$phase) {
+ $scope.$apply();
+ }
+ });
+ $scope.$on("roles-typeahead-received", function(event, roles) {
+ $scope.rolesTypeaheadValues = roles;
+ if (!$scope.$$phase) {
+ $scope.$apply();
+ }
+ });
+ $scope.$on("checkAuthentication-success", function() {
+ sessionStorage.setItem("authenticateAttempts", 0);
+ $scope.loaded = true;
+ $rootScope.activeUI = true;
+ $scope.applyScope();
+ if (!$scope.queryStringApplied) {
+ $scope.queryStringApplied = true;
+ setTimeout(function() {
+ if ($scope.queryString.org) {
+ $rootScope.$broadcast("change-org", $scope.queryString.org);
+ }
+ }, 1e3);
+ }
+ $rootScope.$broadcast("app-initialized");
+ });
+ $scope.$on("checkAuthentication-error", function(args, err, missingData, email) {
+ $scope.loaded = true;
+ if (err && !$scope.use_sso && notRegistration()) {
+ ug.logout();
+ $location.path("/login");
+ $scope.applyScope();
+ } else {
+ if (missingData && notRegistration()) {
+ if (!email && $scope.use_sso) {
+ window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
+ return;
+ }
+ ug.reAuthenticate(email);
+ }
+ }
+ });
+ $scope.$on("reAuthenticate-success", function(args, err, data, user, organizations, applications) {
+ sessionStorage.setItem("authenticateAttempts", 0);
+ $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
+ $rootScope.$emit("loginSuccesful", user, organizations, applications);
+ $rootScope.$broadcast("checkAuthentication-success");
+ $scope.applyScope(function() {
+ $scope.deferredLogin.resolve();
+ $location.path("/org-overview");
+ });
+ });
+ var authenticateAttempts = parseInt(sessionStorage.getItem("authenticateAttempts") || 0);
+ $scope.$on("reAuthenticate-error", function() {
+ if ($scope.use_sso) {
+ if (authenticateAttempts++ > 5) {
+ $rootScope.$broadcast("alert", "error", "There is an issue with authentication. Please contact support.");
+ return;
+ }
+ console.error("Failed to login via sso " + authenticateAttempts);
+ sessionStorage.setItem("authenticateAttempts", authenticateAttempts);
+ window.location = $rootScope.urls().LOGIN_URL + "?callback=" + encodeURIComponent($location.absUrl().split("?")[0]);
+ } else {
+ if (notRegistration()) {
+ ug.logout();
+ $location.path("/login");
+ $scope.applyScope();
+ }
+ }
+ });
+ $scope.$on("loginSuccessful", function() {
+ $rootScope.activeUI = true;
+ });
+ $scope.$on("app-changed", function(args, oldVal, newVal, preventReload) {
+ if (newVal !== oldVal && !preventReload) {
+ $route.reload();
+ }
+ });
+ $scope.$on("org-changed", function(args, oldOrg, newOrg) {
+ ug.getApplications();
+ $route.reload();
+ });
+ $scope.$on("app-settings-received", function(evt, data) {});
+ $scope.$on("request-times-slow", function(evt, averageRequestTimes) {
+ $rootScope.$broadcast("alert", "info", "We are experiencing performance issues on our server. Please click Get Help for support if this continues.");
+ });
+ var lastPage = "";
+ $scope.$on("$routeChangeSuccess", function() {
+ verifyUser();
+ $scope.showDemoBar = $location.path().slice(0, "/performance".length) === "/performance";
+ if (!$scope.showDemoBar) {
+ $rootScope.demoData = false;
+ }
+ setTimeout(function() {
+ lastPage = "";
+ }, 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;
+ $scope.hasApplications = Object.keys(applications).length > 0;
+ });
+ ug.getAppSettings();
+ $rootScope.startFirstTimeUser = function() {
+ $rootScope.hideModal("introjs");
+ $rootScope.help.introjs_StartEvent();
+ $scope.startHelp();
+ };
+ } ]);
+ "use strict";
+ AppServices.Directives.directive("pageTitle", [ "$rootScope", "ug", function($rootScope, ug) {
+ return {
+ restrict: "E",
+ transclude: true,
+ templateUrl: "global/page-title.html",
+ link: function linkFn(scope, lElement, attrs) {
+ scope.title = attrs.title;
+ scope.icon = attrs.icon;
+ scope.showHelp = function() {
+ $("#need-help").modal("show");
+ };
+ scope.sendHelp = function() {
+ data.jsonp_raw("apigeeuihelpemail", "", {
+ useremail: $rootScope.userEmail
+ }).then(function() {
+ $rootScope.$broadcast("alert", "success", "Email sent. Our team will be in touch with you shortly.");
+ }, function() {
+ $rootScope.$broadcast("alert", "error", "Problem Sending Email. Try sending an email to mobile@apigee.com.");
+ });
+ $("#need-help").modal("hide");
+ };
+ }
+ };
+ } ]);
+ "use strict";
+ AppServices.Services.factory("ug", function(configuration, $rootScope, utility, $q, $http, $resource, $log, $analytics, $location) {
+ var requestTimes = [], running = false, currentRequests = {};
+ 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");
+ };
+ return {
+ get: function(prop, isObject) {
+ return isObject ? this.client().getObject(prop) : this.client().get(prop);
+ },
+ set: function(prop, value) {
+ this.client().set(prop, value);
+ },
+ getUrls: function(qs) {
+ var host = $location.host();
+ var BASE_URL = "";
+ var DATA_URL = "";
+ var use_sso = false;
+ switch (true) {
+ case host === "appservices.apigee.com" && location.pathname.indexOf("/dit") >= 0:
+ 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:
+ 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":
+ DATA_URL = Usergrid.overrideUrl;
+ break;
+
+ case host === "apigee.com":
+ BASE_URL = "https://accounts.apigee.com";
+ DATA_URL = "https://api.usergrid.com";
+ use_sso = true;
+ break;
+
+ case host === "usergrid.dev":
+ DATA_URL = "https://api.usergrid.com";
+ break;
+
+ default:
+ DATA_URL = Usergrid.overrideUrl;
+ break;
+ }
+ 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);
+ this.client().set("token", null);
+ this.client().orgLogin(username, password, function(err, data, user, organizations, applications) {
+ if (err) {
+ $rootScope.$broadcast("loginFailed", err, data);
+ } else {
+ self.initializeCurrentUser(function() {
+ $rootScope.$broadcast("loginSuccesful", user, organizations, applications);
+ });
+ }
+ });
+ },
+ checkAuthentication: function(force) {
+ var ug = this;
+ var client = ug.client();
+ var initialize = function() {
+ ug.initializeCurrentUser(function() {
+ $rootScope.userEmail = client.get("email");
+ $rootScope.organizations = client.getObject("organizations");
+ $rootScope.applications = client.getObject("applications");
+ $rootScope.currentOrg = client.get("orgName");
+ $rootScope.currentApp = client.get("appName");
+ var size = 0, key;
+ for (key in $rootScope.applications) {
+ if ($rootScope.applications.hasOwnProperty(key)) size++;
+ }
+ $rootScope.$broadcast("checkAuthentication-success", client.getObject("organizations"), client.getObject("applications"), client.get("orgName"), client.get("appName"), client.get("email"));
+ });
+ }, isAuthenticated = function() {
+ var authenticated = client.get("token") !== null && client.get("organizations") !== null;
+ if (authenticated) {
+ initialize();
+ }
+ return authenticated;
+ };
+ if (!isAuthenticated() || force) {
+ if (!client.get("token")) {
+ return $rootScope.$broadcast("checkAuthentication-error", "no token", {}, client.get("email"));
+ }
+ this.client().reAuthenticateLite(function(err) {
+ var missingData = err || (!client.get("orgName") || !client.get("appName") || !client.getObject("organizations") || !client.getObject("applications"));
+ var email = client.get("email");
+ if (err || missingData) {
+ $rootScope.$broadcast("checkAuthentication-error", err, missingData, email);
+ } else {
+ initialize();
+ }
+ });
+ }
+ },
+ reAuthenticate: function(email, eventOveride) {
+ var ug = this;
+ this.client().reAuthenticate(email, function(err, data, user, organizations, applications) {
+ if (!err) {
+ $rootScope.currentUser = user;
+ }
+ if (!err) {
+ $rootScope.userEmail = user.get("email");
+ $rootScope.organizations = organizations;
+ $rootScope.applications = applications;
+ $rootScope.currentOrg = ug.get("orgName");
+ $rootScope.currentApp = ug.get("appName");
+ $rootScope.currentUser = user._data;
+ $rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
+ }
+ $rootScope.$broadcast((eventOveride || "reAuthenticate") + "-" + (err ? "error" : "success"), err, data, user, organizations, applications);
+ });
+ },
+ logoutCallback: function() {
+ $rootScope.$broadcast("userNotAuthenticated");
+ },
+ logout: function() {
+ $rootScope.activeUI = false;
+ $rootScope.userEmail = "user@apigee.com";
+ $rootScope.organizations = {
+ noOrg: {
+ name: "No Orgs Found"
+ }
+ };
+ $rootScope.applications = {
+ noApp: {
+ name: "No Apps Found"
+ }
+ };
+ $rootScope.currentOrg = "No Org Found";
+ $rootScope.currentApp = "No App Found";
+ sessionStorage.setItem("accessToken", null);
+ sessionStorage.setItem("userUUID", null);
+ sessionStorage.setItem("userEmail", null);
+ this.client().logout();
+ this._client = null;
+ },
+ client: function() {
+ var options = {
+ buildCurl: true,
+ logging: true
+ };
+ if (Usergrid.options && Usergrid.options.client) {
+ options.keys = Usergrid.options.client;
+ }
+ this._client = this._client || new Usergrid.Client(options, $rootScope.urls().DATA_URL);
+ return this._client;
+ },
+ setClientProperty: function(key, value) {
+ this.client().set(key, value);
+ },
+ getTopCollections: function() {
+ var options = {
+ method: "GET",
+ endpoint: ""
+ };
+ this.client().request(options, function(err, data) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error getting collections");
+ } else {
+ var collections = data.entities[0].metadata.collections;
+ $rootScope.$broadcast("top-collections-received", collections);
+ }
+ });
+ },
+ createCollection: function(collectionName) {
+ var collections = {};
+ collections[collectionName] = {};
+ var metadata = {
+ metadata: {
+ collections: collections
+ }
+ };
+ var options = {
+ method: "PUT",
+ body: metadata,
+ endpoint: ""
+ };
+ this.client().request(options, function(err, data) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error creating collection");
+ } else {
+ $rootScope.$broadcast("collection-created", collections);
+ }
+ });
+ },
+ getApplications: function() {
+ this.client().getApplications(function(err, applications) {
+ if (err) {
+ applications && console.error(applications);
+ } else {
+ $rootScope.$broadcast("applications-received", applications);
+ }
+ });
+ },
+ getAdministrators: function() {
+ this.client().getAdministrators(function(err, administrators) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error getting administrators");
+ }
+ $rootScope.$broadcast("administrators-received", administrators);
+ });
+ },
+ createApplication: function(appName) {
+ this.client().createApplication(appName, function(err, applications) {
+ if (err) {
+ $rootScope.$broadcast("alert", "error", "error creating application");
+ } else {
+ $rootScope.$broadcast("applications-created", applications, appName);
+ $rootScope.$broadcast("applications-received", applications);
+ }
+ });
+ },
+ createAdministrator: function(adminName) {
+ this.client().createAdministrator(adminName, function(err, administrators) {
+
<TRUNCATED>