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 @@ + + +
{{title}}
+
+ +
+
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 @@
+ +