diff --git a/_attachments/index.html b/_attachments/index.html
index fd5173e..34d190f 100644
--- a/_attachments/index.html
+++ b/_attachments/index.html
@@ -51,7 +51,8 @@
-
Loading...
+
+
Loading...
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
-
{{report.displayDate}}
-
{{report.value.application_version_name}}
-
{{report.value.android_version}}
-
{{report.value.device}}
+
{{bug.latest}}
+
{{bug.value.count}}
+
{{bug.key[0]}}
- {{report.value.signature.digest}}
- Caused by: {{report.value.signature.rootCause}}
+ {{bug.key[1]}}
+ Caused by: {{bug.key[2]}}
+
-
diff --git a/_attachments/partials/dashboard.html b/_attachments/partials/dashboard.html
index 376ee3a..90cc5c7 100644
--- a/_attachments/partials/dashboard.html
+++ b/_attachments/partials/dashboard.html
@@ -75,8 +75,6 @@
diff --git a/_attachments/script/BugsBrowserControllers.js b/_attachments/script/BugsBrowserControllers.js
index 9f30cd1..edfc817 100644
--- a/_attachments/script/BugsBrowserControllers.js
+++ b/_attachments/script/BugsBrowserControllers.js
@@ -19,23 +19,25 @@
(function(acralyzerConfig,angular,acralyzer,acralyzerEvents) {
"use strict";
- function ReportsBrowserCtrl($scope, ReportsStore, $routeParams) {
+ function BugsBrowserCtrl($scope, ReportsStore, $routeParams) {
if($routeParams.app) {
- console.log("ReportsBrowser: Direct access to app " + $routeParams.app);
+ console.log("BugsBrowser: Direct access to app " + $routeParams.app);
$scope.acralyzer.setApp($routeParams.app);
} else {
- console.log("ReportsBorwser: Access to default app " + acralyzerConfig.defaultApp);
+ console.log("BugsBorwser: Access to default app " + acralyzerConfig.defaultApp);
$scope.acralyzer.setApp(acralyzerConfig.defaultApp);
}
- console.log("Init ReportsBrowserCtrl");
- $scope.reportsCount = 15;
+ console.log("Init BugsBrowserCtrl");
+ $scope.bugsList = [];
+ $scope.bugsCount = 15;
+ $scope.hideSolvedBugs = true;
$scope.previousStartKeys = [];
- $scope.selectedReport = "";
+ $scope.selectedBug = "";
$scope.startKey = null;
$scope.nextKey = null;
$scope.startNumber = 1;
- $scope.endNumber = $scope.reportsCount;
+ $scope.endNumber = $scope.bugsCount;
$scope.fullSearch = false;
$scope.loading = true;
$scope.noFilter = { value: "false", label: "No filter"};
@@ -63,42 +65,55 @@
$scope.getData();
};
- $scope.getData = function() {
- $scope.loading = true;
- var successHandler = function(data) {
- // Success Handler
- console.log("Refresh data for latest reports");
- $scope.reports = data.rows;
- $scope.totalReports = data.total_rows;
- for(var row = 0; row < $scope.reports.length; row++) {
- if($scope.filterName === $scope.noFilter && $scope.filterValue === $scope.noFilterValue) {
- $scope.reports[row].displayDate = moment($scope.reports[row].key).fromNow();
- } else {
- $scope.reports[row].displayDate = moment($scope.reports[row].key[1]).fromNow();
+ var mergeBugsLists = function(list1, list2) {
+ var bugslist = {};
+ for(var i1 = 0; i1 < list1.length; i1++) {
+ bugslist[list1[i1].id] = {idxlist1: i1};
+ }
+ for(var i2 = 0; i2 < list2.length; i2++) {
+ if(!bugslist[list2[i2].id]){
+ // Mark bug as not found in list1
+ bugslist[list2[i2].id] = {idxlist1: -1};
+ }
+ bugslist[list2[i2].id].idxlist2 = i2;
+ }
+ for(var iBugs in bugslist) {
+ if(bugslist[iBugs].idxlist1 < 0 && bugslist[iBugs].idxlist2 >= 0) {
+ // New bug
+ list1.push(list2[bugslist[iBugs].idxlist2]);
+ } else if (bugslist[iBugs].idxlist1 >= 0 && bugslist[iBugs].idxlist2 < 0) {
+ // Deleted bug
+ list1.splice(bugslist[iBugs].idxlist1, 1);
+ } else if(bugslist[iBugs].idxlist1 >= 0 && bugslist[iBugs].idxlist2 >= 0) {
+ if(!list1[bugslist[iBugs].idxlist1].equals(list2[bugslist[iBugs].idxlist2])) {
+ // Updated bug
+ list1[bugslist[iBugs].idxlist1].updateWithBug(list2[bugslist[iBugs].idxlist2]);
}
}
-
- // If there are more rows, here is the key to the next page
- $scope.nextKey =data.next_row ? data.next_row.key : null;
- $scope.startNumber = ($scope.previousStartKeys.length * $scope.reportsCount) + 1;
- $scope.endNumber = $scope.startNumber + $scope.reports.length - 1;
- console.log($scope);
- $scope.loading = false;
- };
-
- var errorHandler = function(response, getResponseHeaders){
- // Error Handler
- $scope.reports=[];
- $scope.totalReports="";
- };
-
- if($scope.filterName === $scope.noFilter || $scope.filterValue === $scope.noFilterValue) {
- ReportsStore.reportsList($scope.startKey, $scope.reportsCount, $scope.fullSearch, successHandler, errorHandler);
- } else {
- ReportsStore.filteredReportsList($scope.filterName.value, $scope.filterValue.value,$scope.startKey, $scope.reportsCount, $scope.fullSearch, successHandler, errorHandler);
}
};
+
+ $scope.getData = function() {
+ $scope.loading = true;
+ ReportsStore.bugsList(function(data) {
+ console.log("Refresh data for latest bugs");
+ console.log(data);
+ mergeBugsLists($scope.bugsList, data.rows);
+ $scope.totalBugs = data.total_rows;
+ for(var row = 0; row < $scope.bugsList.length; row++) {
+ $scope.bugsList[row].latest = moment($scope.bugsList[row].value.latest).fromNow();
+ }
+ $scope.loading = false;
+ },
+ function(response, getResponseHeaders){
+ $scope.bugsList=[];
+ $scope.totalBugs="";
+ $scope.loading = false;
+ });
+
+ };
+
$scope.changeFilterValues = function() {
if($scope.filterName === $scope.noFilter) {
@@ -126,6 +141,22 @@
}
};
+ $scope.toggleSolved = function(bug) {
+ console.log("let's mark this bug as solved:");
+ console.log(bug);
+ ReportsStore.toggleSolved(bug, function(data){
+ console.log(data);
+ });
+ };
+
+ $scope.shouldBeDisplayed = function(bug) {
+ if($scope.hideSolvedBugs && bug.value.solved) {
+ return false;
+ } else {
+ return true;
+ }
+ };
+
$scope.filterValueSelected = function() {
// reset pagination
$scope.startKey = null;
@@ -134,31 +165,12 @@
$scope.getData();
};
- $scope.loadReport = function(report) {
- $scope.selectedReport = ReportsStore.reportDetails(report.id, function(data) {
- data.readableUptime = moment.duration(data.uptime, 'seconds').humanize();
- data.formatedCrashDate = moment(data.USER_CRASH_DATE).format('LLL');
- data.formatedTimestamp = moment(data.timestamp).format('LLL');
- });
- };
-
- $scope.deleteReport = function(report) {
- if($scope.selectedReport === report) {
- $scope.selectedReport = "";
- }
-
- ReportsStore.deleteReport(report, function(data) {
- var index = $scope.reports.indexOf(report);
- $scope.reports.splice(index, 1);
- });
- };
-
$scope.$on(acralyzerEvents.LOGGED_IN, $scope.getData);
$scope.$on(acralyzerEvents.LOGGED_OUT, $scope.getData);
$scope.getData();
}
- acralyzer.controller('ReportsBrowserCtrl', ["$scope", "ReportsStore", "$routeParams", ReportsBrowserCtrl]);
+ acralyzer.controller('BugsBrowserCtrl', ["$scope", "ReportsStore", "$routeParams", BugsBrowserCtrl]);
})(window.acralyzerConfig,window.angular,window.acralyzer,window.acralyzerEvents);
diff --git a/_attachments/script/app.js b/_attachments/script/app.js
index a314d90..14003b5 100644
--- a/_attachments/script/app.js
+++ b/_attachments/script/app.js
@@ -25,6 +25,7 @@
$routeProvider.
when('/dashboard/:app', {templateUrl: 'partials/dashboard.html', controller: 'DashboardCtrl', activetab: "dashboard"}).
when('/reports-browser/:app', {templateUrl: 'partials/reports-browser.html', controller: 'ReportsBrowserCtrl', activetab: "reports-browser"}).
+ when('/bugs-browser/:app', {templateUrl: 'partials/bugs-browser.html', controller: 'BugsBrowserCtrl', activetab: "bugs-browser"}).
when('/report-details/:app/:reportId', {templateUrl: 'partials/report-details.html', controller: 'ReportDetailsCtrl', activetab: "none"}).
when('/admin/:app', {templateUrl: 'partials/admin.html', controller: 'AdminCtrl', activetab: "admin"}).
otherwise({redirectTo: '/dashboard/' + acralyzerConfig.defaultApp});
@@ -162,4 +163,72 @@
}
};
});
+
+ /* http://www.frangular.com/2012/12/pagination-cote-client-directive-angularjs.html */
+ acralyzer.directive('paginator', function () {
+ var pageSizeLabel = "Page size";
+ return {
+ priority: 0,
+ restrict: 'A',
+ scope: {items: '&'},
+ template:
+ '' +
+ pageSizeLabel + ' ' +
+ '',
+ replace: false,
+ compile: function compile(tElement, tAttrs, transclude) {
+ return {
+ pre: function preLink(scope, iElement, iAttrs, controller) {
+ scope.pageSizeList = [5, 10, 20, 50, 100];
+ scope.paginator = {
+ pageSize: 5,
+ currentPage: 0
+ };
+
+ scope.isFirstPage = function () {
+ return scope.paginator.currentPage === 0;
+ };
+ scope.isLastPage = function () {
+ return scope.paginator.currentPage >= scope.items().length / scope.paginator.pageSize - 1;
+ };
+ scope.incPage = function () {
+ if (!scope.isLastPage()) {
+ scope.paginator.currentPage++;
+ }
+ };
+ scope.decPage = function () {
+ if (!scope.isFirstPage()) {
+ scope.paginator.currentPage--;
+ }
+ };
+ scope.firstPage = function () {
+ scope.paginator.currentPage = 0;
+ };
+ scope.numberOfPages = function () {
+ return Math.ceil(scope.items().length / scope.paginator.pageSize);
+ };
+ scope.$watch('paginator.pageSize', function(newValue, oldValue) {
+ if (newValue !== oldValue) {
+ scope.firstPage();
+ }
+ });
+
+ // ---- Functions available in parent scope -----
+
+ scope.$parent.firstPage = function () {
+ scope.firstPage();
+ };
+ // Function that returns the reduced items list, to use in ng-repeat
+ scope.$parent.pageItems = function () {
+ var start = scope.paginator.currentPage * scope.paginator.pageSize;
+ var limit = scope.paginator.pageSize;
+ console.log(scope.items());
+ return scope.items().slice(start, start + limit);
+ };
+ },
+ post: function postLink(scope, iElement, iAttrs, controller) {}
+ };
+ }
+ };
+ });
})(window.acralyzerConfig, window.angular, window.jQuery, window.acralyzerEvents);
diff --git a/_attachments/style/main.css b/_attachments/style/main.css
index a022696..7b1e09b 100644
--- a/_attachments/style/main.css
+++ b/_attachments/style/main.css
@@ -262,4 +262,19 @@ report-summary .label-androidversion {
.icon-phone {
background-image: url(../img/device-black.png);
background-position: 0px;
+}
+
+.icon-bug-unsolved {
+ background-image: url(../img/bug.png);
+ background-position: 0px;
+}
+
+.icon-bug-unsolved:hover, .icon-bug-solved:hover {
+ background-image: url(../img/bug-rollover.png);
+ background-position: 0px;
+}
+
+.icon-bug-solved {
+ background-image: url(../img/bug-solved.png);
+ background-position: 0px;
}
\ No newline at end of file