diff --git a/Gruntfile.js b/Gruntfile.js
index 049f8696e..81dfc5a39 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -137,6 +137,7 @@ module.exports = function(grunt) {
'bower_components/angular-md5/angular-md5.js',
'bower_components/angular-mocks/angular-mocks.js',
'bower_components/ngtouch/src/ngTouch.js',
+ 'bower_components/angularjs-slider/dist/rzslider.min.js',
'angular-bitauth/angular-bitauth.js',
'angular-bitcore-wallet-client/angular-bitcore-wallet-client.js'
],
@@ -161,6 +162,13 @@ module.exports = function(grunt) {
'node_modules/cordova-plugin-qrscanner/dist/cordova-plugin-qrscanner-lib.min.js'
],
dest: 'www/js/app.js'
+ },
+ css: {
+ src: [
+ 'www/css/main.css',
+ 'bower_components/angularjs-slider/dist/rzslider.css'
+ ],
+ dest: 'www/css/main.css'
}
},
uglify: {
diff --git a/bower.json b/bower.json
index 1547d384f..3228e0aea 100644
--- a/bower.json
+++ b/bower.json
@@ -11,6 +11,7 @@
"angular-gettext": "2.2.1",
"angular-moment": "0.10.1",
"angular-qrcode": "bitpay/angular-qrcode#~6.3.0",
+ "angularjs-slider": "^6.2.3",
"ionic": "https://github.com/ionic-team/ionic-v1.git",
"moment": "2.10.3",
"ng-lodash": "0.2.3",
diff --git a/src/js/app.js b/src/js/app.js
index 784745fdd..f57c482c7 100644
--- a/src/js/app.js
+++ b/src/js/app.js
@@ -11,6 +11,7 @@ var modules = [
'ngLodash',
'ngCsv',
'angular-md5',
+ 'rzModule',
'bwcModule',
'bitauthModule',
'copayApp.filters',
diff --git a/src/js/controllers/preferencesLogs.js b/src/js/controllers/preferencesLogs.js
index 7d356e615..af1de847c 100644
--- a/src/js/controllers/preferencesLogs.js
+++ b/src/js/controllers/preferencesLogs.js
@@ -3,17 +3,51 @@
angular.module('copayApp.controllers').controller('preferencesLogs',
function($scope, historicLog, platformInfo) {
+ var logLevels = historicLog.getLevels();
+ var logFilterWeight = historicLog.getDefaultLevel().weight;
+
+ // Log level slider setup.
+ var logLevelSliderInitialValue = logFilterWeight;
+ var logLevelSliderCeil = logFilterWeight;
+ var logLevelSliderStepsArray = [];
+
+ for (var i = 0; i < logLevels.length; i++) {
+ logLevelSliderStepsArray.push({value: logLevels[i].weight, legend: logLevels[i].label});
+ }
+
+ $scope.logOptionsTitle = 'Filter log';
+ $scope.logOptions = {
+ logLevelSlider: {
+ value: logLevelSliderInitialValue,
+ opts: {
+ floor: 0,
+ ceil: logLevelSliderCeil,
+ step: 1,
+ hideLimitLabels: true,
+ hidePointerLabels: true,
+ showTicks: true,
+ showTicksValues: false,
+ showSelectionBar: true,
+ stepsArray: logLevelSliderStepsArray,
+ onEnd: function(sliderId, modelValue, highValue, pointerType) {
+ $scope.filteredLogs = historicLog.get(modelValue);
+ }
+ }
+ }
+ };
+
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.isCordova = platformInfo.isCordova;
});
$scope.$on("$ionicView.enter", function(event, data) {
- $scope.logs = historicLog.get();
+ $scope.allLogs = historicLog.get();
+ $scope.filteredLogs = historicLog.get(logFilterWeight);
$scope.prepare = function() {
var log = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n';
log += '\n\n';
- log += $scope.logs.map(function(v) {
+ log += $scope.allLogs.map(function(v) {
return v.msg;
}).join('\n');
@@ -35,5 +69,8 @@ angular.module('copayApp.controllers').controller('preferencesLogs',
);
};
+ $scope.showOptionsMenu = function() {
+ $scope.showOptions = true;
+ };
});
});
diff --git a/src/js/directives/logOptions.js b/src/js/directives/logOptions.js
new file mode 100644
index 000000000..6947daeb6
--- /dev/null
+++ b/src/js/directives/logOptions.js
@@ -0,0 +1,20 @@
+'use strict';
+
+angular.module('copayApp.directives')
+ .directive('logOptions', function($timeout) {
+ return {
+ restrict: 'E',
+ templateUrl: 'views/includes/logOptions.html',
+ transclude: true,
+ scope: {
+ show: '=logOptionsShow',
+ options: '=logOptions',
+ title: '=logOptionsTitle'
+ },
+ link: function(scope, element, attrs) {
+ scope.hide = function() {
+ scope.show = false;
+ };
+ }
+ };
+ });
diff --git a/src/js/routes.js b/src/js/routes.js
index b557a6282..e8fc190ef 100644
--- a/src/js/routes.js
+++ b/src/js/routes.js
@@ -44,7 +44,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
function($delegate, platformInfo) {
var historicLog = historicLogProvider.$get();
- ['debug', 'info', 'warn', 'error', 'log'].forEach(function(level) {
+ historicLog.getLevels().forEach(function(levelDesc) {
+ var level = levelDesc.level;
if (platformInfo.isDevel && level == 'error') return;
var orig = $delegate[level];
@@ -75,7 +76,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
console.log('Error at log decorator:', e);
v = 'undefined';
}
- return v;
+ var ts = '[' + new Date().toISOString() + ']';
+ var lvl = '[' + level + '] ';
+ return ts + lvl + v;
});
try {
diff --git a/src/js/services/historicLog.js b/src/js/services/historicLog.js
index f0cd8e5a5..604fa3294 100644
--- a/src/js/services/historicLog.js
+++ b/src/js/services/historicLog.js
@@ -1,9 +1,32 @@
'use strict';
var logs = [];
angular.module('copayApp.services')
- .factory('historicLog', function historicLog() {
+ .factory('historicLog', function historicLog(lodash) {
var root = {};
+ var levels = [
+ { level: 'info', weight: 0, label: 'Info'},
+ { level: 'warn', weight: 1, label: 'Warning'},
+ { level: 'error', weight: 2, label: 'Error'},
+ { level: 'debug', weight: 3, label: 'Debug', default: true}
+ ];
+
+ // Create an array of level weights for performant filtering.
+ var weight = {};
+ for (var i = 0; i < levels.length; i++) {
+ weight[levels[i].level] = levels[i].weight;
+ }
+
+ root.getLevels = function() {
+ return levels;
+ };
+
+ root.getDefaultLevel = function() {
+ return lodash.find(levels, function(l) {
+ return l.default;
+ });
+ };
+
root.add = function(level, msg) {
logs.push({
level: level,
@@ -11,8 +34,14 @@ angular.module('copayApp.services')
});
};
- root.get = function() {
- return logs;
+ root.get = function(filterWeight) {
+ var filteredLogs = logs;
+ if (filterWeight != undefined) {
+ filteredLogs = lodash.filter(logs, function(l) {
+ return weight[l.level] <= filterWeight;
+ });
+ }
+ return filteredLogs;
};
return root;
diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js
index ae44c7b26..d5598a5b8 100644
--- a/src/js/services/profileService.js
+++ b/src/js/services/profileService.js
@@ -134,7 +134,7 @@ angular.module('copayApp.services')
wallet.setNotificationsInterval(UPDATE_PERIOD);
wallet.openWallet(function(err) {
if (wallet.status !== true)
- $log.log('Wallet + ' + walletId + ' status:' + wallet.status)
+ $log.debug('Wallet + ' + walletId + ' status:' + wallet.status)
});
});
diff --git a/src/sass/directives/directives.scss b/src/sass/directives/directives.scss
index 79e3edbd3..c6e7466f0 100644
--- a/src/sass/directives/directives.scss
+++ b/src/sass/directives/directives.scss
@@ -1 +1,2 @@
-@import "gravatar"
+@import "gravatar";
+@import "rzslider";
diff --git a/src/sass/directives/rzslider.scss b/src/sass/directives/rzslider.scss
new file mode 100644
index 000000000..b17d434dd
--- /dev/null
+++ b/src/sass/directives/rzslider.scss
@@ -0,0 +1,47 @@
+.stable-slider.rzslider .rz-bar {
+ background: $v-light-gray;
+ height: 2px;
+}
+.stable-slider.rzslider .rz-selection {
+ background: $v-accent-color;
+}
+
+.stable-slider.rzslider .rz-pointer {
+ width: 20px;
+ height: 20px;
+ top: -9px;
+ bottom: 0;
+ background-color: $v-accent-color;
+}
+
+.stable-slider.rzslider .rz-pointer:after {
+ display: none;
+}
+
+.stable-slider.rzslider .rz-bubble {
+ bottom: 14px;
+}
+
+.stable-slider.rzslider .rz-limit {
+ font-weight: bold;
+ color: $v-accent-color;
+}
+
+.stable-slider.rzslider .rz-tick {
+ width: 10px;
+ height: 10px;
+ margin-left: 4px;
+ border-radius: 50%;
+ background: $v-light-gray;
+ top: -1px;
+}
+
+.stable-slider.rzslider .rz-tick.rz-selected {
+ background: $v-accent-color;
+}
+
+.stable-slider.rzslider .rz-tick-legend {
+ top: 20px;
+ font-size: 12px;
+ color: $v-dark-gray;
+}
\ No newline at end of file
diff --git a/src/sass/views/includes/logOptions.scss b/src/sass/views/includes/logOptions.scss
new file mode 100644
index 000000000..45018e575
--- /dev/null
+++ b/src/sass/views/includes/logOptions.scss
@@ -0,0 +1,68 @@
+log-options {
+
+ $border-color: #EFEFEF;
+
+ .bp-action-sheet__sheet {
+ padding-left: 2rem;
+ padding-right: .75rem;
+ }
+
+ .log-options {
+ .option {
+ border: 0;
+ padding-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-bottom: 1px;
+ overflow: visible;
+
+ > i {
+ color: $v-accent-color;
+ padding: 0 0 5px 0;
+ margin-left: -5px;
+
+ > img {
+ height: 39px;
+ width: 39px;
+ padding: 4px;
+ }
+ }
+ }
+ .log-options-inner {
+ display: flex;
+ position: relative;
+ padding-top: 16px;
+ padding-bottom: 16px;
+
+ &::after {
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: 1px;
+ background: $border-color;
+ bottom: 0;
+ right: 0;
+ content: '';
+ }
+
+ .check {
+ padding: 0 1.2rem;
+ }
+ }
+ .log-options-details {
+ flex-grow: 1;
+
+ .log-options-name {
+ padding-bottom: 5px;
+ }
+ }
+
+ .log-level-slider {
+ width: 90%;
+ margin: auto;
+ font-size: 12px;
+ height: 90px;
+ }
+ }
+
+}
diff --git a/src/sass/views/tab-settings.scss b/src/sass/views/tab-settings.scss
index 30578066f..6152f1b41 100644
--- a/src/sass/views/tab-settings.scss
+++ b/src/sass/views/tab-settings.scss
@@ -75,6 +75,14 @@
font-weight: bold;
}
}
+ .setting-range-hdist {
+ display: table;
+ width: 100%;
+ span {
+ display: table-cell;
+ text-align: center;
+ }
+ }
.settings-list {
.item {
color: $v-dark-gray;
@@ -119,6 +127,10 @@
color: #00901B;
}
}
+ .log-text {
+ font-size: 12px;
+ line-height: 18px;
+ }
}
#tab-settings {
diff --git a/www/views/includes/logOptions.html b/www/views/includes/logOptions.html
new file mode 100644
index 000000000..798e0fdb0
--- /dev/null
+++ b/www/views/includes/logOptions.html
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/www/views/preferencesLogs.html b/www/views/preferencesLogs.html
index 91e3e3261..7008b693f 100644
--- a/www/views/preferencesLogs.html
+++ b/www/views/preferencesLogs.html
@@ -1,8 +1,13 @@
-
+
{{'Session Log' | translate}}
+
+
+
@@ -14,10 +19,10 @@
-
+
- -
-
+
-
+
{{l.msg}}
@@ -25,4 +30,9 @@
+
+