diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json index c88da2e9588b2cc4a8d449538ed843cd9b2a4f0e..fdcb25ada09862e4796bbd9d8fb53a45f9471f4d 100644 --- a/www/i18n/locale-en-GB.json +++ b/www/i18n/locale-en-GB.json @@ -38,6 +38,7 @@ "BTN_HELP_TOUR": "Features tour", "BTN_HELP_TOUR_SCREEN": "Discover this screen", "BTN_DOWNLOAD": "Download", + "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Download account statement", "BTN_MODIFY": "Modify", "DAYS": "days", "NO_ACCOUNT_QUESTION": "Not a member yet? Register now!", @@ -51,7 +52,7 @@ "UNIVERSAL_DIVIDEND": "Universal dividend", "UD": "UD", "DATE_PATTERN": "DD/MM/YYYY HH:mm", - "DATE_FILE_PATTERN": "YYYYMMDD", + "DATE_FILE_PATTERN": "YYYY-MM-DD", "DATE_SHORT_PATTERN": "DD/MM/YY", "DATE_MONTH_YEAR_PATTERN": "MM/YYYY", "EMPTY_PARENTHESIS": "(empty)", @@ -477,6 +478,12 @@ "SAVE_ID": "Save your login", "STRONG_LEVEL": "Strong <span class=\"hidden-xs \">(6 questions minimum)</span>", "TITLE": "Sign-in and security" + }, + "FILE_NAME": "Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv", + "HEADERS": { + "TIME": "Date", + "AMOUNT": "Amount", + "COMMENT": "Comment" } }, "TRANSFER": { diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json index cb27a85d1661629b32fb578ea7c13a7db9e8b2b8..a6fb16a84637098a9ef6ed30955d72e87506f902 100644 --- a/www/i18n/locale-en.json +++ b/www/i18n/locale-en.json @@ -38,6 +38,7 @@ "BTN_HELP_TOUR": "Features tour", "BTN_HELP_TOUR_SCREEN": "Discover this screen", "BTN_DOWNLOAD": "Download", + "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Download account statement", "BTN_MODIFY": "Modify", "DAYS": "days", "NO_ACCOUNT_QUESTION": "Not a member yet? Register now!", @@ -51,7 +52,7 @@ "UNIVERSAL_DIVIDEND": "Universal dividend", "UD": "UD", "DATE_PATTERN": "MM/DD/YYYY HH:mm", - "DATE_FILE_PATTERN": "YYYYMMDD", + "DATE_FILE_PATTERN": "YYYY-MM-DD", "DATE_SHORT_PATTERN": "MM/DD/YY", "DATE_MONTH_YEAR_PATTERN": "MM/YYYY", "EMPTY_PARENTHESIS": "(empty)", @@ -477,6 +478,12 @@ "SAVE_ID": "Save your login", "STRONG_LEVEL": "Strong <span class=\"hidden-xs \">(6 questions minimum)</span>", "TITLE": "Sign-in and security" + }, + "FILE_NAME": "Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv", + "HEADERS": { + "TIME": "Date", + "AMOUNT": "Amount", + "COMMENT": "Comment" } }, "TRANSFER": { diff --git a/www/i18n/locale-es-ES.json b/www/i18n/locale-es-ES.json index 0e0c12842367b3f46c65e3309f9263c2630bf803..35c567a217b6556f3c75be49b1206cdb577293f6 100644 --- a/www/i18n/locale-es-ES.json +++ b/www/i18n/locale-es-ES.json @@ -38,6 +38,7 @@ "BTN_HELP_TOUR": "Visita guiada", "BTN_HELP_TOUR_SCREEN": "Descubrir esta pantalla", "BTN_DOWNLOAD": "Descargar", + "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Descargar el estado de cuenta", "BTN_MODIFY": "Cambio", "DAYS": "Dias", "NO_ACCOUNT_QUESTION": "TodavÃa no miembre ? Creer una cuenta !", @@ -51,7 +52,7 @@ "UNIVERSAL_DIVIDEND": "Dividendo universal", "UD": "DU", "DATE_PATTERN": "DD/MM/YYYY HH:mm", - "DATE_FILE_PATTERN": "YYYYMMDD", + "DATE_FILE_PATTERN": "YYYY-MM-DD", "DATE_SHORT_PATTERN": "DD/MM/YY", "DATE_MONTH_YEAR_PATTERN": "MM/YYYY", "EMPTY_PARENTHESIS": "(vacÃo)", @@ -477,6 +478,12 @@ "SAVE_ID": "Salvar sus identificadores", "STRONG_LEVEL": "Alto <span class=\"hidden-xs \">(6 preguntas mÃnimo)</span>", "TITLE": "Cuenta y seguridad" + }, + "FILE_NAME": "Encuesta cuenta {{pubkey|formatPubkey}} a {{currentTime|formatDateForFile}}.csv", + "HEADERS": { + "TIME": "Fecha", + "AMOUNT": "Cantidad", + "COMMENT": "Comentario" } }, "TRANSFER": { diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json index 74288cd810720038d97d4212926b64e9246a212b..1b69134ec7f114e9a4cdec52f8c9b329d902749b 100644 --- a/www/i18n/locale-fr-FR.json +++ b/www/i18n/locale-fr-FR.json @@ -38,6 +38,7 @@ "BTN_HELP_TOUR": "Visite guidée", "BTN_HELP_TOUR_SCREEN": "Découvrir cet écran", "BTN_DOWNLOAD": "Télécharger", + "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Télécharger le relevé du compte", "BTN_MODIFY": "Modifier", "DAYS": "jours", "NO_ACCOUNT_QUESTION": "Pas de encore membre ? Créer un compte !", @@ -51,7 +52,7 @@ "UNIVERSAL_DIVIDEND": "Dividende universel", "UD": "DU", "DATE_PATTERN": "DD/MM/YY HH:mm", - "DATE_FILE_PATTERN": "YYYYMMDD", + "DATE_FILE_PATTERN": "YYYY-MM-DD", "DATE_SHORT_PATTERN": "DD/MM/YY", "DATE_MONTH_YEAR_PATTERN": "MM/YYYY", "EMPTY_PARENTHESIS": "(vide)", @@ -478,6 +479,12 @@ "SAVE_ID": "Sauvegarder vos identifiants", "STRONG_LEVEL": "Fort <span class=\"hidden-xs \">(6 questions minimum)</span>", "TITLE": "Compte et sécurité" + }, + "FILE_NAME": "Relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv", + "HEADERS": { + "TIME": "Date", + "AMOUNT": "Montant", + "COMMENT": "Commentaire" } }, "TRANSFER": { diff --git a/www/i18n/locale-nl-NL.json b/www/i18n/locale-nl-NL.json index 22daf0c5821c92d075166af755723120b8071f21..0aa917f0a6ea05a937139e05ae5f7bace2413b10 100644 --- a/www/i18n/locale-nl-NL.json +++ b/www/i18n/locale-nl-NL.json @@ -38,6 +38,7 @@ "BTN_HELP_TOUR": "Rondleiding", "BTN_HELP_TOUR_SCREEN": "Ontdek dit scherm", "BTN_DOWNLOAD": "Downloaden", + "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Downloaden het rekeningoverzicht", "BTN_MODIFY": "Bewerken", "DAYS": "dagen", "NO_ACCOUNT_QUESTION": "Nog geen lid? Registreer nu!", @@ -51,8 +52,8 @@ "UNIVERSAL_DIVIDEND": "Universeel dividend", "UD": "UD", "DATE_PATTERN": "DD-MM-YYYY HH:mm", + "DATE_FILE_PATTERN": "YYYY-MM-DD", "DATE_SHORT_PATTERN": "DD-MM-YY", - "DATE_FILE_PATTERN": "YYYYMMDD", "DATE_MONTH_YEAR_PATTERN": "MM-YYYY", "EMPTY_PARENTHESIS": "(leeg)", "UID": "Pseudoniem", @@ -385,6 +386,12 @@ "POPUP_REGISTER": { "TITLE": "Voer een pseudoniem in", "HELP": "Een pseudoniem is nodig voor anderen om je te kunnen vinden." + }, + "FILE_NAME": "Rekeningafschrift {{pubkey|formatPubkey}} {{currentTime|formatDateForFile}}.csv", + "HEADERS": { + "TIME": "Datum", + "AMOUNT": "Bedrag", + "COMMENT": "Commentaar" } }, "TRANSFER": { diff --git a/www/js/controllers/wallet-controllers.js b/www/js/controllers/wallet-controllers.js index 97bf3873bc5376101e1002e39098cfa63b0ad265..e3c8ebc2107acccf069e28192dd749e62a7e4dc9 100644 --- a/www/js/controllers/wallet-controllers.js +++ b/www/js/controllers/wallet-controllers.js @@ -524,7 +524,8 @@ function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state, } -function WalletTxController($scope, $filter, $ionicPopover, $state, UIUtils, csWallet, Modals, csSettings, BMA) { +function WalletTxController($scope, $filter, $ionicPopover, $state, UIUtils, csWallet, + Modals, csSettings, BMA,csTx) { 'ngInject'; $scope.loading = true; @@ -574,6 +575,12 @@ function WalletTxController($scope, $filter, $ionicPopover, $state, UIUtils, csW $scope.motion.show({ink: false}); }; + $scope.getDataForAccountStatement = function(options) { + options = options || -1;// all TX (full history) + var pubkey = $scope.formData.pubkey; + csTx.downloadAccountStatement(pubkey, options); + }; + // Updating wallet data $scope.doUpdate = function() { console.debug('[wallet] TX history reloading...'); diff --git a/www/js/filters.js b/www/js/filters.js index 87669213c13a788a9dc6b8e7cabaae0dad12bb1c..b6c64869c4f58b70507011aa3771db310f759298 100644 --- a/www/js/filters.js +++ b/www/js/filters.js @@ -208,9 +208,9 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }; }) - .filter('formatDateForFile', function($rootScope) { + .filter('formatDateForFile', function(filterTranslations) { return function(input) { - return input ? moment.unix(parseInt(input)).local().format($rootScope.translations.DATE_FILE_PATTERN || 'YYYY-MM-DD') : ''; + return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_FILE_PATTERN || 'YYYY-MM-DD') : ''; }; }) diff --git a/www/js/services/tx-services.js b/www/js/services/tx-services.js index 33fb1a6a34f1d641e951f3012681599e9299d3ee..244965fe9b293402d53cb845390e8928ff7f2b57 100644 --- a/www/js/services/tx-services.js +++ b/www/js/services/tx-services.js @@ -2,7 +2,7 @@ angular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services', 'cesium.settings.services', 'cesium.wot.services' ]) -.factory('csTx', function($q, $timeout, BMA, Api, csConfig, csSettings, csWot) { +.factory('csTx', function($q, $timeout, $filter, $translate, BMA, Api, csConfig, csSettings, csWot, FileSaver) { 'ngInject'; function factory(id, BMA) { @@ -335,15 +335,70 @@ angular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services', console.debug('[tx] TX and sources loaded in '+ (new Date().getTime()-now) +'ms'); return data; }); - } + }; + + // [NEW] Manage click on the export button + downloadAccountStatement = function(pubkey, options) { + + // Load account TX data + fromTime = options; + + console.debug("[RML9] call method onExportButtonClick() on pubkey: " + pubkey); + + return $q.all([ + $translate(['ACCOUNT.HEADERS.TIME', + 'COMMON.UID', + 'COMMON.PUBKEY', + 'ACCOUNT.HEADERS.AMOUNT', + 'ACCOUNT.HEADERS.COMMENT']), + BMA.blockchain.current(), + loadData(pubkey, fromTime) + ]) + .then(function(result){ + + var translations = result[0]; + //TODO : Utiliser plutôt csCurency + var currentTime = (result[1] && result[1].medianTime) || moment().utc().unix(); + result = result[2]; + + + if (!result || !result.tx || !result.tx.history) return; // no TX + + var formatDecimal = $filter('formatDecimal'); + var formatPubkey = $filter('formatPubkey'); + var formatDate = $filter('formatDate'); + var formatDateForFile = $filter('formatDateForFile'); + + var headers = [translations['ACCOUNT.HEADERS.TIME'], + translations['COMMON.UID'], + translations['COMMON.PUBKEY'], + translations['ACCOUNT.HEADERS.AMOUNT'], + translations['ACCOUNT.HEADERS.COMMENT']]; + var content = result.tx.history.reduce(function(res, tx){ + return res.concat([ + formatDate(tx.time), + tx.uid, + tx.pubkey, + formatDecimal(tx.amount/100), + '"' + tx.comment + '"' + ].join(';') + '\n'); + }, [headers.join(';') + '\n']); + + var file = new Blob(content, {type: 'text/plain; charset=utf-8'}); + $translate('ACCOUNT.FILE_NAME', {pubkey: pubkey, currentTime : currentTime}) + .then(function(result){ + FileSaver.saveAs(file, result); + }) + }); + }; - ; return { id: id, load: loadData, // api extension - api: api + api: api, + downloadAccountStatement: downloadAccountStatement }; } diff --git a/www/templates/wallet/view_wallet_tx.html b/www/templates/wallet/view_wallet_tx.html index 6d5b913fe9bfe7d5119345300619a04c18e68188..9e87fd9d8efbee1ee161b7fe541f22a31a5ac65a 100644 --- a/www/templates/wallet/view_wallet_tx.html +++ b/www/templates/wallet/view_wallet_tx.html @@ -42,6 +42,11 @@ title="{{'COMMON.BTN_REFRESH' | translate}}"> </button> + <button class="button button-stable button-small-padding icon ion-android-download ink" + ng-click="getDataForAccountStatement()" + title="{{'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT' | translate}}"> + </button> + <cs-extension-point name="buttons"></cs-extension-point> @@ -73,14 +78,12 @@ <!-- Pending transactions --> <span class="item item-pending item-divider" ng-if="formData.tx.pendings && formData.tx.pendings.length"> {{:locale:'ACCOUNT.PENDING_TX'|translate}} - <div class="badge item-note" ng-bind-html=":rebind:formData.parameters.currency | currencySymbol"> - </div> </span> - <span class="item item-pending item-avatar item-badge-right ink" + <div class="item item-tx item-icon-left" ng-repeat="tx in formData.tx.pendings" ng-include="'templates/wallet/view_tx.html'"> - </span> + </div> <!-- Last Transactions --> <span class="item item-divider" ng-if="!loading">