From b7cfd86f22d5916c32f929d392b37a43319b73ff Mon Sep 17 00:00:00 2001 From: Andy Phillipson Date: Fri, 14 Jul 2017 15:21:15 -0400 Subject: [PATCH 1/6] Enhance logging with timestamps and filtering. --- Gruntfile.js | 8 +++ bower.json | 1 + src/js/app.js | 1 + src/js/controllers/preferencesLogs.js | 41 ++++++++++++++- src/js/directives/logOptions.js | 20 ++++++++ src/js/routes.js | 7 ++- src/js/services/historicLog.js | 35 +++++++++++-- src/js/services/profileService.js | 2 +- src/sass/directives/directives.scss | 3 +- src/sass/directives/rzslider.scss | 47 +++++++++++++++++ src/sass/views/includes/logOptions.scss | 68 +++++++++++++++++++++++++ src/sass/views/tab-settings.scss | 12 +++++ www/views/includes/logOptions.html | 7 +++ www/views/preferencesLogs.html | 18 +++++-- 14 files changed, 257 insertions(+), 13 deletions(-) create mode 100644 src/js/directives/logOptions.js create mode 100644 src/sass/directives/rzslider.scss create mode 100644 src/sass/views/includes/logOptions.scss create mode 100644 www/views/includes/logOptions.html 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 @@
+ + From 635d35ab87113d914f6249e73f4aafe59e7127dc Mon Sep 17 00:00:00 2001 From: Andy Phillipson Date: Fri, 14 Jul 2017 15:24:25 -0400 Subject: [PATCH 2/6] Remove unnecessary class. --- src/sass/views/tab-settings.scss | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/sass/views/tab-settings.scss b/src/sass/views/tab-settings.scss index 6152f1b41..7266b3099 100644 --- a/src/sass/views/tab-settings.scss +++ b/src/sass/views/tab-settings.scss @@ -75,14 +75,6 @@ font-weight: bold; } } - .setting-range-hdist { - display: table; - width: 100%; - span { - display: table-cell; - text-align: center; - } - } .settings-list { .item { color: $v-dark-gray; From 79350b44b31cef5c0185d63f754e29838e9fcae9 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 18 Jul 2017 17:23:00 -0300 Subject: [PATCH 3/6] custom check-bar for filtered logs --- src/js/controllers/preferencesLogs.js | 71 ++++++++++++++++----------- src/js/directives/logOptions.js | 7 ++- src/sass/views/includes/checkBar.scss | 60 ++++++++++++++++++++++ src/sass/views/views.scss | 1 + www/views/includes/checkBar.html | 10 ++++ www/views/includes/logOptions.html | 5 +- www/views/preferencesLogs.html | 4 +- 7 files changed, 126 insertions(+), 32 deletions(-) create mode 100644 src/sass/views/includes/checkBar.scss create mode 100644 www/views/includes/checkBar.html diff --git a/src/js/controllers/preferencesLogs.js b/src/js/controllers/preferencesLogs.js index af1de847c..bcc060d0e 100644 --- a/src/js/controllers/preferencesLogs.js +++ b/src/js/controllers/preferencesLogs.js @@ -1,48 +1,63 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesLogs', - function($scope, historicLog, platformInfo) { + function($scope, historicLog, platformInfo, lodash, gettextCatalog) { var logLevels = historicLog.getLevels(); - var logFilterWeight = historicLog.getDefaultLevel().weight; + var defaultLevel = historicLog.getDefaultLevel(); // Log level slider setup. - var logLevelSliderInitialValue = logFilterWeight; - var logLevelSliderCeil = logFilterWeight; - var logLevelSliderStepsArray = []; + // var logLevelSliderInitialValue = logFilterWeight; + // var logLevelSliderCeil = logFilterWeight; + // var logLevelSliderStepsArray = []; + $scope.logOptions = {}; - for (var i = 0; i < logLevels.length; i++) { - logLevelSliderStepsArray.push({value: logLevels[i].weight, legend: logLevels[i].label}); - } + // 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.setOptionSelected = function(level) { + var weight = $scope.logOptions[level].weight; + $scope.fillClass = 'fill-bar-' + level; + $scope.filteredLogs = historicLog.get(weight); + lodash.each($scope.logOptions, function(opt) { + opt.selected = opt.weight <= weight ? true : false; + }); }; + // $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.logOptionsTitle = gettextCatalog.getString('Filter log'); + $scope.logOptions = lodash.indexBy(logLevels, 'level'); + $scope.setOptionSelected(defaultLevel.level); }); $scope.$on("$ionicView.enter", function(event, data) { $scope.allLogs = historicLog.get(); - $scope.filteredLogs = historicLog.get(logFilterWeight); + $scope.filteredLogs = historicLog.get(defaultLevel.weight); $scope.prepare = function() { var log = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n'; diff --git a/src/js/directives/logOptions.js b/src/js/directives/logOptions.js index 6947daeb6..8fbeb439f 100644 --- a/src/js/directives/logOptions.js +++ b/src/js/directives/logOptions.js @@ -9,12 +9,17 @@ angular.module('copayApp.directives') scope: { show: '=logOptionsShow', options: '=logOptions', - title: '=logOptionsTitle' + fillClass: '=logOptionsFillClass', + title: '=logOptionsTitle', + onSelect: '=logOptionsOnSelect' }, link: function(scope, element, attrs) { scope.hide = function() { scope.show = false; }; + scope.getFillClass = function(index) { + scope.onSelect(index); + }; } }; }); diff --git a/src/sass/views/includes/checkBar.scss b/src/sass/views/includes/checkBar.scss new file mode 100644 index 000000000..cc124a0e2 --- /dev/null +++ b/src/sass/views/includes/checkBar.scss @@ -0,0 +1,60 @@ +#check-bar { + $bar-widths: ( + info: 3rem, + warn: 37%, + error: 65%, + debug: 104%, + ); + .item { + padding: 40px; + } + .checkbox-icon { + width: 22px; + height: 22px; + } + .checkbox-icon:after { + border: none; + } + .check-bar { + position: relative; + @each $name, $bar-width in $bar-widths { + .initial-bar { + width: 0%; + border: 2px solid $v-success-color; + top: 40px; + left: -7px; + z-index: 99; + border-radius: 10px; + position: absolute; + } + .fill-bar-#{$name} { + width: $bar-width !important; + transition: width .2s; + } + } + .base-bar { + position: absolute; + width: 100%; + border-bottom: 2px solid #f2f2f2; + top: 41px; + z-index: 98; + left: 0px; + } + &.list { + margin-top: 20px; + display: flex; + justify-content: space-between; + .custom-checkbox { + text-align: -webkit-center; + .item { + border-style: none; + z-index: 999; + background-color: inherit; + } + label { + padding-top: 5px; + } + } + } + } +} diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 7a8058339..e55a1f36b 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -47,3 +47,4 @@ @import "integrations/integrations"; @import "custom-amount"; @import "includes/pin"; +@import "includes/checkBar"; diff --git a/www/views/includes/checkBar.html b/www/views/includes/checkBar.html new file mode 100644 index 000000000..4621caa70 --- /dev/null +++ b/www/views/includes/checkBar.html @@ -0,0 +1,10 @@ +
+
+
+
+
+ + +
+
+
diff --git a/www/views/includes/logOptions.html b/www/views/includes/logOptions.html index 798e0fdb0..5811bb3cc 100644 --- a/www/views/includes/logOptions.html +++ b/www/views/includes/logOptions.html @@ -1,7 +1,8 @@
{{title}}
-
+ +
diff --git a/www/views/preferencesLogs.html b/www/views/preferencesLogs.html index 7008b693f..317f5b377 100644 --- a/www/views/preferencesLogs.html +++ b/www/views/preferencesLogs.html @@ -33,6 +33,8 @@ + log-options-fill-class="fillClass" + log-options="logOptions" + log-options-on-select="setOptionSelected"> From adc81ffa4cea7274ad8c51f1d594b667e089b284 Mon Sep 17 00:00:00 2001 From: Andy Phillipson Date: Wed, 19 Jul 2017 16:42:15 -0400 Subject: [PATCH 4/6] Showing the session log some love. Replaced slider with checkbox bar. --- Gruntfile.js | 8 -- src/js/app.js | 1 - src/js/controllers/preferencesLogs.js | 118 ++++++++++------------ src/js/directives/logOptions.js | 10 +- src/js/routes.js | 4 +- src/js/services/configService.js | 4 + src/js/services/historicLog.js | 13 ++- src/sass/directives/directives.scss | 1 - src/sass/directives/rzslider.scss | 47 --------- src/sass/views/includes/checkBar.scss | 28 +++--- src/sass/views/includes/logOptions.scss | 124 ++++++++++++++---------- src/sass/views/tab-settings.scss | 12 ++- src/sass/views/views.scss | 1 + www/views/includes/checkBar.html | 4 +- www/views/includes/logOptions.html | 21 +++- www/views/preferencesLogs.html | 24 ++--- 16 files changed, 200 insertions(+), 220 deletions(-) delete mode 100644 src/sass/directives/rzslider.scss diff --git a/Gruntfile.js b/Gruntfile.js index 81dfc5a39..049f8696e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -137,7 +137,6 @@ 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' ], @@ -162,13 +161,6 @@ 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/src/js/app.js b/src/js/app.js index f57c482c7..784745fdd 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -11,7 +11,6 @@ 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 bcc060d0e..5ee106bf0 100644 --- a/src/js/controllers/preferencesLogs.js +++ b/src/js/controllers/preferencesLogs.js @@ -1,91 +1,73 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesLogs', - function($scope, historicLog, platformInfo, lodash, gettextCatalog) { + function($scope, historicLog, lodash, configService, gettextCatalog) { + var config = configService.getSync(); var logLevels = historicLog.getLevels(); - var defaultLevel = historicLog.getDefaultLevel(); + var selectedLevel; - // Log level slider setup. - // var logLevelSliderInitialValue = logFilterWeight; - // var logLevelSliderCeil = logFilterWeight; - // var logLevelSliderStepsArray = []; - $scope.logOptions = {}; + $scope.logOptions = lodash.indexBy(logLevels, 'level'); - // for (var i = 0; i < logLevels.length; i++) { - // logLevelSliderStepsArray.push({ - // value: logLevels[i].weight, - // legend: logLevels[i].label - // }); - // } + var filterLogs = function(weight) { + $scope.filteredLogs = historicLog.get(weight); + }; $scope.setOptionSelected = function(level) { var weight = $scope.logOptions[level].weight; $scope.fillClass = 'fill-bar-' + level; - $scope.filteredLogs = historicLog.get(weight); + filterLogs(weight); lodash.each($scope.logOptions, function(opt) { opt.selected = opt.weight <= weight ? true : false; + opt.head = opt.weight == weight; + }); + + // Save the setting. + var opts = { + log: { + filter: level + } + }; + configService.set(opts, function(err) { + if (err) $log.debug(err); }); }; - // $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.prepareLogs = function() { + var log = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n'; + log += '\n\n'; + log += historicLog.get().map(function(v) { + return '[' + v.timestamp + '][' + v.level + ']' + v.msg; + }).join('\n'); + + return log; + }; + + $scope.sendLogs = function() { + var body = $scope.prepareLogs(); + + window.plugins.socialsharing.shareViaEmail( + body, + 'Copay Logs', + null, // TO: must be null or an array + null, // CC: must be null or an array + null, // BCC: must be null or an array + null, // FILES: can be null, a string, or an array + function() {}, + function() {} + ); + }; + + $scope.showOptionsMenu = function() { + $scope.showOptions = true; + }; $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isCordova = platformInfo.isCordova; - $scope.logOptionsTitle = gettextCatalog.getString('Filter log'); - $scope.logOptions = lodash.indexBy(logLevels, 'level'); - $scope.setOptionSelected(defaultLevel.level); + selectedLevel = lodash.has(config, 'log.filter') ? historicLog.getLevel(config.log.filter) : historicLog.getDefaultLevel(); + $scope.setOptionSelected(selectedLevel.level); }); $scope.$on("$ionicView.enter", function(event, data) { - $scope.allLogs = historicLog.get(); - $scope.filteredLogs = historicLog.get(defaultLevel.weight); - - $scope.prepare = function() { - var log = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n'; - log += '\n\n'; - log += $scope.allLogs.map(function(v) { - return v.msg; - }).join('\n'); - - return log; - }; - - $scope.sendLogs = function() { - var body = $scope.prepare(); - - window.plugins.socialsharing.shareViaEmail( - body, - 'Copay Logs', - null, // TO: must be null or an array - null, // CC: must be null or an array - null, // BCC: must be null or an array - null, // FILES: can be null, a string, or an array - function() {}, - function() {} - ); - }; - - $scope.showOptionsMenu = function() { - $scope.showOptions = true; - }; + filterLogs(selectedLevel.weight); }); }); diff --git a/src/js/directives/logOptions.js b/src/js/directives/logOptions.js index 8fbeb439f..6b00cdc0c 100644 --- a/src/js/directives/logOptions.js +++ b/src/js/directives/logOptions.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.directives') - .directive('logOptions', function($timeout) { + .directive('logOptions', function($timeout, platformInfo) { return { restrict: 'E', templateUrl: 'views/includes/logOptions.html', @@ -10,13 +10,17 @@ angular.module('copayApp.directives') show: '=logOptionsShow', options: '=logOptions', fillClass: '=logOptionsFillClass', - title: '=logOptionsTitle', - onSelect: '=logOptionsOnSelect' + onSelect: '=logOptionsOnSelect', + onCopy: '=logOptionsOnCopy', + onSend: '=logOptionsOnSend' }, link: function(scope, element, attrs) { + scope.isCordova = platformInfo.isCordova; + scope.hide = function() { scope.show = false; }; + scope.getFillClass = function(index) { scope.onSelect(index); }; diff --git a/src/js/routes.js b/src/js/routes.js index e8fc190ef..4904be9f6 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -76,9 +76,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr console.log('Error at log decorator:', e); v = 'undefined'; } - var ts = '[' + new Date().toISOString() + ']'; - var lvl = '[' + level + '] '; - return ts + lvl + v; + return v; }); try { diff --git a/src/js/services/configService.js b/src/js/services/configService.js index e4521296a..b7ee099f6 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -83,6 +83,10 @@ angular.module('copayApp.services').factory('configService', function(storageSer emailNotifications: { enabled: false, }, + + log: { + filter: 'debug', + }, }; var configCache = null; diff --git a/src/js/services/historicLog.js b/src/js/services/historicLog.js index 604fa3294..88446ae54 100644 --- a/src/js/services/historicLog.js +++ b/src/js/services/historicLog.js @@ -5,10 +5,10 @@ angular.module('copayApp.services') var root = {}; var levels = [ - { level: 'info', weight: 0, label: 'Info'}, + { level: 'error', weight: 0, label: 'Error'}, { level: 'warn', weight: 1, label: 'Warning'}, - { level: 'error', weight: 2, label: 'Error'}, - { level: 'debug', weight: 3, label: 'Debug', default: true} + { level: 'info', weight: 2, label: 'Info', default: true}, + { level: 'debug', weight: 3, label: 'Debug'} ]; // Create an array of level weights for performant filtering. @@ -21,6 +21,12 @@ angular.module('copayApp.services') return levels; }; + root.getLevel = function(level) { + return lodash.find(levels, function(l) { + return l.level == level; + }); + }; + root.getDefaultLevel = function() { return lodash.find(levels, function(l) { return l.default; @@ -29,6 +35,7 @@ angular.module('copayApp.services') root.add = function(level, msg) { logs.push({ + timestamp: new Date().toISOString(), level: level, msg: msg, }); diff --git a/src/sass/directives/directives.scss b/src/sass/directives/directives.scss index c6e7466f0..9159d3f23 100644 --- a/src/sass/directives/directives.scss +++ b/src/sass/directives/directives.scss @@ -1,2 +1 @@ @import "gravatar"; -@import "rzslider"; diff --git a/src/sass/directives/rzslider.scss b/src/sass/directives/rzslider.scss deleted file mode 100644 index b17d434dd..000000000 --- a/src/sass/directives/rzslider.scss +++ /dev/null @@ -1,47 +0,0 @@ -.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/checkBar.scss b/src/sass/views/includes/checkBar.scss index cc124a0e2..337635505 100644 --- a/src/sass/views/includes/checkBar.scss +++ b/src/sass/views/includes/checkBar.scss @@ -1,9 +1,10 @@ #check-bar { $bar-widths: ( - info: 3rem, - warn: 37%, - error: 65%, - debug: 104%, + // defined by user, example: + // error: 10%, + // warn: 37%, + // info: 65%, + // debug: 90% ); .item { padding: 40px; @@ -17,16 +18,17 @@ } .check-bar { position: relative; + .initial-bar-default { + border: 2px solid $v-success-color; + width: 0%; + top: 40px; + z-index: 99; + border-radius: 10px; + position: absolute; + } + .initial-bar { + } @each $name, $bar-width in $bar-widths { - .initial-bar { - width: 0%; - border: 2px solid $v-success-color; - top: 40px; - left: -7px; - z-index: 99; - border-radius: 10px; - position: absolute; - } .fill-bar-#{$name} { width: $bar-width !important; transition: width .2s; diff --git a/src/sass/views/includes/logOptions.scss b/src/sass/views/includes/logOptions.scss index 45018e575..89dfef121 100644 --- a/src/sass/views/includes/logOptions.scss +++ b/src/sass/views/includes/logOptions.scss @@ -7,62 +7,82 @@ log-options { padding-right: .75rem; } - .log-options { - .option { - border: 0; - padding-right: 0; - padding-top: 0; - padding-bottom: 0; - margin-bottom: 1px; - overflow: visible; + .entry { + 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; + > i { + color: $v-accent-color; + padding: 0 0 5px 0; + margin-left: -5px; - > img { - height: 39px; - width: 39px; - padding: 4px; - } + > 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; - } } + .entry-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: ''; + } + } + + .entry-details { + flex-grow: 1; + + .entry-name { + padding-bottom: 5px; + } + } + + #check-bar { + $bar-widths: ( + // Order must match weight, see services/historicLog.js + error: 10%, + warn: 35%, + info: 65%, + debug: 90% + ); + .check-bar { + .initial-bar { + border: 2px solid $v-accent-color; + } + @each $name, $bar-width in $bar-widths { + .fill-bar-#{$name} { + width: $bar-width !important; + } + } + } + + .head .checkbox-icon { + width: 22px; + height: 22px; + top: 0; + } + + .checkbox-icon { + width: 10px; + height: 10px; + top: 6px; + } + } } diff --git a/src/sass/views/tab-settings.scss b/src/sass/views/tab-settings.scss index 7266b3099..9c2e14138 100644 --- a/src/sass/views/tab-settings.scss +++ b/src/sass/views/tab-settings.scss @@ -119,9 +119,19 @@ color: #00901B; } } - .log-text { + .log-bg { + background: white; + } + .log-entry { font-size: 12px; line-height: 18px; + border: none; + } + .log-timestamp { + font-weight: bold; + } + .log-level { + font-weight: bold; } } diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index e55a1f36b..5c8974a7e 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -47,4 +47,5 @@ @import "integrations/integrations"; @import "custom-amount"; @import "includes/pin"; +@import "includes/logOptions"; @import "includes/checkBar"; diff --git a/www/views/includes/checkBar.html b/www/views/includes/checkBar.html index 4621caa70..38b3637ea 100644 --- a/www/views/includes/checkBar.html +++ b/www/views/includes/checkBar.html @@ -1,8 +1,8 @@
-
+
-
+
diff --git a/www/views/includes/logOptions.html b/www/views/includes/logOptions.html index 5811bb3cc..1fa0c9f51 100644 --- a/www/views/includes/logOptions.html +++ b/www/views/includes/logOptions.html @@ -1,8 +1,21 @@ -
{{title}}
- +
Log options
+ + +
+
+
Copy to clipboard
+
+
+
+ + +
+
+
Send by email
+
+
+
diff --git a/www/views/preferencesLogs.html b/www/views/preferencesLogs.html index 317f5b377..84d0528ac 100644 --- a/www/views/preferencesLogs.html +++ b/www/views/preferencesLogs.html @@ -9,20 +9,15 @@ - -
- - -
+
-
-
    +
    +
    No entries for this log level filter setting.
    +
    • + [{{l.timestamp}}] + [{{l.level}}] {{l.msg}}
    • @@ -31,10 +26,11 @@
    + log-options-fill-class="fillClass" + log-options-on-select="setOptionSelected" + log-options-on-copy="prepareLogs" + log-options-on-send="sendLogs"> From 5729604584fe7e3743fc9bb571914b7d325f4c74 Mon Sep 17 00:00:00 2001 From: Andy Phillipson Date: Thu, 20 Jul 2017 10:32:31 -0400 Subject: [PATCH 5/6] Remove unneeded dependency. --- bower.json | 1 - 1 file changed, 1 deletion(-) diff --git a/bower.json b/bower.json index 3228e0aea..1547d384f 100644 --- a/bower.json +++ b/bower.json @@ -11,7 +11,6 @@ "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", From 9cf603fe1c6b1bb1ec963f9ec6edc518408b793f Mon Sep 17 00:00:00 2001 From: Andy Phillipson Date: Thu, 20 Jul 2017 10:55:56 -0400 Subject: [PATCH 6/6] Auto dismiss action sheet when copy or email selected. --- www/views/includes/logOptions.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/views/includes/logOptions.html b/www/views/includes/logOptions.html index 1fa0c9f51..3729bba38 100644 --- a/www/views/includes/logOptions.html +++ b/www/views/includes/logOptions.html @@ -2,7 +2,7 @@
    Log options
    - +
    @@ -10,7 +10,7 @@
    - +