diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json index 21a8b9d34472f0089964159c6f85f8ce3e068c9a..416d094a0efb50afdf9a0950b57a5ad9d1960152 100644 --- a/www/i18n/locale-en.json +++ b/www/i18n/locale-en.json @@ -76,7 +76,8 @@ "ACCOUNT": "My Account", "TRANSFER": "Transfer", "SCAN": "Scan", - "SETTINGS": "Settings" + "SETTINGS": "Settings", + "NETWORK": "Network" }, "ABOUT": { "TITLE": "About", diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json index c338981abb22d08f081e3febf4a1cada9b4ea84c..a958ca89b0fc224a83cc1ee77d593fc9838163c8 100644 --- a/www/i18n/locale-fr-FR.json +++ b/www/i18n/locale-fr-FR.json @@ -76,7 +76,8 @@ "ACCOUNT": "Mon compte", "TRANSFER": "Virement", "SCAN": "Scanner", - "SETTINGS": "Paramètres" + "SETTINGS": "Paramètres", + "NETWORK" : "Réseau" }, "ABOUT": { "TITLE": "A propos", diff --git a/www/index.html b/www/index.html index d50ae1e56631da216f43b06cfed250ac7714189a..c0da044430766150c2217cbf5d4c472d655071ab 100644 --- a/www/index.html +++ b/www/index.html @@ -79,6 +79,7 @@ <script src="dist/dist_js/app/controllers/wallet-controllers.js"></script> <script src="dist/dist_js/app/controllers/wot-controllers.js"></script> <script src="dist/dist_js/app/controllers/peer-controllers.js"></script> + <script src="dist/dist_js/app/controllers/network-controllers.js"></script> <script src="dist/dist_js/app/controllers/currency-controllers.js"></script> <script src="dist/dist_js/app/controllers/currency-charts-controllers.js"></script> <script src="dist/dist_js/app/controllers/transfer-controllers.js"></script> @@ -130,6 +131,8 @@ <!-- config --> <script src="js/config.js"></script> <!-- endbuild --> + <script type="text/javascript"> + </script> </head> <body ng-app="cesium" id="cesium" ng-strict-di ng-class="{'nobackdrop': $root.tour}"> <ion-nav-view></ion-nav-view> diff --git a/www/js/config.js b/www/js/config.js index e1bf3d8ed4bcd06acf72560a84dd6f5487cdb77b..6ac50b8efa614f70fb0547852d5a6fc5684568d7 100644 --- a/www/js/config.js +++ b/www/js/config.js @@ -20,9 +20,10 @@ angular.module("cesium.config", []) "useLocalStorage": true, "useRelative": true, "initPhase": false, - "expertMode": true, + "expertMode": false, + "decimalCount": 2, "helptip": { - "enable": false, + "enable": true, "installDocUrl": { "fr-FR": "http://www.le-sou.org/devenir-noeud/", "en": "https://github.com/duniter/duniter/blob/master/doc/install-a-node.md" @@ -34,20 +35,14 @@ angular.module("cesium.config", []) }, "plugins": { "es": { - "enable": true, - "askEnable": false, - "host": "localhost", - "port": 9200, - "wsPort": 9400, - "notifications": { - "tx": { - "enable": false - } - } + "enable": false, + "askEnable": true, + "host": "data.le-sou.org", + "port": "80" } }, "version": "0.5.2", - "build": "2017-01-05T18:56:38.746Z", + "build": "2017-01-09T14:35:34.003Z", "newIssueUrl": "https://github.com/duniter/cesium/issues/new?labels=bug" }) diff --git a/www/js/controllers.js b/www/js/controllers.js index 3eb8aef8d71db780315c8f97887557c37b0af6af..fa5f8a80ef40864452360c5a4d879e4b9d462aac 100644 --- a/www/js/controllers.js +++ b/www/js/controllers.js @@ -9,6 +9,7 @@ angular.module('cesium.controllers', [ /*'cesium.currency-charts.controllers',*/ 'cesium.wot.controllers', 'cesium.transfer.controllers', - 'cesium.settings.controllers' + 'cesium.settings.controllers', + 'cesium.network.controllers' ]) ; diff --git a/www/js/controllers/network-controllers.js b/www/js/controllers/network-controllers.js new file mode 100644 index 0000000000000000000000000000000000000000..190b8cea97d6cbc5dcba91d0c09105b3e608fc52 --- /dev/null +++ b/www/js/controllers/network-controllers.js @@ -0,0 +1,116 @@ + +angular.module('cesium.network.controllers', ['cesium.services']) + +.config(function($stateProvider) { + 'ngInject'; + + $stateProvider + + .state('app.network_view', { + url: "/network/view", + views: { + 'menuContent': { + templateUrl: "templates/network/view_network.html", + controller: 'NetworkViewCtrl' + } + }, + }); +}) + +.controller('NetworkViewCtrl', NetworkViewController) + +.controller('PeerCtrl', PeerController) + +; + +function NetworkViewController($scope, $q, $translate, $timeout, BMA, UIUtils, csSettings, csCurrency, csNetwork) { + + $scope.loadingPeers = true; + $scope.formData = { + useRelative: csSettings.data.useRelative + }; + + $scope.screen = UIUtils.screen; + + $scope.$on('$ionicView.enter', function(e, state) { + $translate(['COMMON.DATE_PATTERN']) + .then(function($translations) { + $scope.datePattern = $translations['COMMON.DATE_PATTERN']; + if (state.stateParams && state.stateParams.name) { // Load by name + csCurrency.searchByName(state.stateParams.name) + .then(function(currency){ + $scope.load(currency); + }); + } + else { + csCurrency.all() + .then(function (currencies) { + if (currencies && currencies.length > 0) { + $scope.load(currencies[0]); + } + + }) + .catch(UIUtils.onError('ERROR.GET_CURRENCY_FAILED')); + } + }); + }); + + $scope.$on('$ionicView.beforeLeave', function(){ + csNetwork.close(); + }); + + $scope.load = function(currency) { + $scope.node = !BMA.node.same(currency.peer.host, currency.peer.port) ? + BMA.instance(currency.peer.host, currency.peer.port) : BMA; + + if ($scope.loadingPeers){ + csNetwork.start($scope.node); + + // Catch event on new peers + var refreshing = false; + csNetwork.api.data.on.changed($scope, function(data){ + if (!refreshing) { + refreshing = true; + $timeout(function() { // Timeout avoid to quick updates + console.debug("Updating UI Peers"); + $scope.peers = data.peers; + // Update currency params + + $scope.loadingPeers = csNetwork.isBusy(); + refreshing = false; + }, 1100); + } + }); + $scope.$on('$destroy', function(){ + csNetwork.close(); + }); + } + + // Show help tip + $scope.showHelpTip(); + }; + + $scope.refresh = function() { + // Network + $scope.loadingPeers = true; + csNetwork.loadPeers(); + }; + + // Show help tip + $scope.showHelpTip = function() { + if (!$scope.isLogin()) return; + index = csSettings.data.helptip.currency; + if (index < 0) return; + + // Create a new scope for the tour controller + var helptipScope = $scope.createHelptipScope(); + if (!helptipScope) return; // could be undefined, if a global tour already is already started + + return helptipScope.startCurrencyTour(index, false) + .then(function(endIndex) { + helptipScope.$destroy(); + csSettings.data.helptip.currency = endIndex; + csSettings.store(); + }); + }; +} diff --git a/www/templates/menu.html b/www/templates/menu.html index b759ae387c0460f415075dea49b7338685f7be4b..685f5539b61c025c00470680617ac4779ba7595d 100644 --- a/www/templates/menu.html +++ b/www/templates/menu.html @@ -63,6 +63,16 @@ <span translate>MENU.CURRENCY</span> </ion-item> + <ion-item menu-close + id="helptip-menu-btn-network" + class="item item-icon-left" + active-link="active" + active-link-path-prefix="#/app/network" + href="#/app/network/view"> + <i class="icon ion-android-globe"></i> + <span translate>MENU.NETWORK</span> + </ion-item> + <!-- Allow extension here --> <cs-extension-point name="menu-discover"></cs-extension-point> diff --git a/www/templates/network/tabs/view_nodes.html b/www/templates/network/tabs/view_nodes.html new file mode 100644 index 0000000000000000000000000000000000000000..24ef977b118a8f7d4eda125fb584be9f2bcada1c --- /dev/null +++ b/www/templates/network/tabs/view_nodes.html @@ -0,0 +1,33 @@ +<div class="list"> + <div id="helptip-currency-peers" + class="item item-divider item-icon-right"> + {{'PEER.PEERS'|translate}} + <ion-spinner class="icon" icon="android" ng-if="loadingPeers"></ion-spinner> + <a class="icon ion-loop gray hidden-xs hidden-sm" ng-if="!loadingPeers" ng-click="refresh()"> + </a> + </div> + <a class="peer-item item item-icon-left" + ng-repeat="peer in peers track by peer.server" + id="helptip-currency-peer-{{$index}}" + ng-class="{ assertive: !peer.online, balanced: (peer.online && peer.hasMainConsensusBlock), energized: (peer.online && !peer.hasMainConsensusBlock)}" + ui-sref="app.view_peer({server: peer.server})"> + <i class="icon ion-android-globe"></i> + <div class="row no-padding"> + <div class="col no-padding"> + <h3><i ng-class="{'ion-person': peer.uid, 'ion-key': !peer.uid}"></i> {{peer.uid || peer.pubkey.substr(0,8)}}</span> <span class="gray">{{peer.dns && ' | ' + peer.dns}}</h3> + <h4>{{peer.server}}</h4> + </div> + <div class="col col-10 no-padding" ng-if="settings.expertMode"> + <h3 class="hidden-sm hidden-xs hidden-md"> + <span ng-if="peer.level"><i class="ion-lock-combination"></i> {{peer.level}}</span> + <span ng-if="!peer.level" translate>PEER.MIRROR</span> + </h3> + <h4 class="hidden-sm hidden-xs hidden-md gray">v{{peer.version}}</h4> + </div> + <div class="col col-20 no-padding"> + <span id="helptip-currency-peer-{{$index}}-block" + class="badge" ng-class="{ 'badge-balanced': peer.hasMainConsensusBlock, 'badge-energized': peer.hasConsensusBlock }">{{peer.currentNumber}}</span> + </div> + </div> + </a> +</div> diff --git a/www/templates/network/view_network.html b/www/templates/network/view_network.html new file mode 100644 index 0000000000000000000000000000000000000000..6b3b79c2437544a327f333fa2909599722f3c27f --- /dev/null +++ b/www/templates/network/view_network.html @@ -0,0 +1,22 @@ +<ion-view + left-buttons="leftButtons" class="pane" + cache-view="false" + > + <ion-nav-title> + </ion-nav-title> + + <ion-nav-buttons side="secondary"> + <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()"> + </button> + </ion-nav-buttons> + + <ion-content> + <div class="row"> + <div class="row responsive-sm"> + <div class="col col-90"> + <ng-include src="'templates/network/tabs/view_nodes.html'"></ng-include> + </div> + </div> + </ion-content> + +</ion-view> diff --git a/www/templates/network/view_peer.html b/www/templates/network/view_peer.html new file mode 100644 index 0000000000000000000000000000000000000000..918789c065760e48b3a4e307dfc2542dd07c9a62 --- /dev/null +++ b/www/templates/network/view_peer.html @@ -0,0 +1,29 @@ +<ion-view> + <ion-nav-title> + <span translate>PEER.TITLE</span> + </ion-nav-title> + + <ion-content class="has-header padding"> + <div class="list"> + + <div class="item item-divider"> + <h2 translate>PEER.KNOWN_PEERS</h2> + </div> + + <div class="item center" ng-if="!loaded"> + <ion-spinner class="icon" icon="android"></ion-spinner> + </div> + + <a class="peer-item item item-icon-left" + collection-repeat="peer in peers" + ng-class="{ assertive: !peer.online, balanced: peer.online }" + target="_blank" + ng-href="{{peer.getURL()}}/blockchain/current"> + <i class="icon ion-android-globe"></i> + <h3><span ng-class="{ positive: peer.uid }">{{peer.uid || peer.pubkey.substr(0,8)}}</span> <span class="gray">{{peer.dns && ' | ' + peer.dns}}</span></h3> + <h4>{{peer.getServer()}} <span class="gray">| {{'PEER.SIGNED_ON_BLOCK' | translate}}</span> #{{peer.blockNumber}}</h4> + <span class="badge" ng-class="{ 'badge-balanced': peer.hasMainConsensusBlock, 'badge-energized': peer.hasConsensusBlock }">{{peer.current.number}}</span> + </a> + </div> + </ion-content> +</ion-view>