From 649cc888abcd9c3e1448c3536924e4d24095eabb Mon Sep 17 00:00:00 2001 From: Eneko Illarramendi Date: Wed, 1 Apr 2020 22:18:46 +0200 Subject: [PATCH] refactor: `/wallet` tweaks --- lnbits/core/static/js/wallet.js | 14 +- lnbits/core/templates/core/index.html | 4 +- lnbits/core/templates/core/wallet.html | 54 +- lnbits/core/views/api.py | 2 +- lnbits/static/js/base.js | 44 +- lnbits/static/js/components.js | 25 +- .../quasar.ie.polyfills.umd.min.js | 2 +- .../vendor/quasar@1.9.12/quasar.min.css | 1 + .../quasar.umd.js | 854 ++++++++++-------- .../vendor/quasar@1.9.12/quasar.umd.min.js | 6 + .../static/vendor/quasar@1.9.7/quasar.min.css | 1 - .../vendor/quasar@1.9.7/quasar.umd.min.js | 6 - .../vendor/{vuex@3.1.2 => vuex@3.1.3}/vuex.js | 16 +- .../{vuex@3.1.2 => vuex@3.1.3}/vuex.min.js | 6 +- lnbits/templates/base.html | 12 +- 15 files changed, 628 insertions(+), 419 deletions(-) rename lnbits/static/vendor/{quasar@1.9.7 => quasar@1.9.12}/quasar.ie.polyfills.umd.min.js (99%) create mode 100644 lnbits/static/vendor/quasar@1.9.12/quasar.min.css rename lnbits/static/vendor/{quasar@1.9.7 => quasar@1.9.12}/quasar.umd.js (98%) create mode 100644 lnbits/static/vendor/quasar@1.9.12/quasar.umd.min.js delete mode 100644 lnbits/static/vendor/quasar@1.9.7/quasar.min.css delete mode 100644 lnbits/static/vendor/quasar@1.9.7/quasar.umd.min.js rename lnbits/static/vendor/{vuex@3.1.2 => vuex@3.1.3}/vuex.js (98%) rename lnbits/static/vendor/{vuex@3.1.2 => vuex@3.1.3}/vuex.min.js (59%) diff --git a/lnbits/core/static/js/wallet.js b/lnbits/core/static/js/wallet.js index 1f64427f..054cb77e 100644 --- a/lnbits/core/static/js/wallet.js +++ b/lnbits/core/static/js/wallet.js @@ -158,12 +158,6 @@ new Vue({ return (this.payments) ? _.where(this.payments, {pending: 1}).length > 0 : false; - }, - paymentsFiltered: function () { - return this.payments; - return this.payments.filter(function (obj) { - return obj.isPaid; - }); } }, methods: { @@ -325,6 +319,14 @@ new Vue({ this.fetchPayments(true).then(function () { dismissMsg(); }); + }, + exportCSV: function () { + LNbits.utils.exportCSV(this.paymentsTable.columns, this.payments); + } + }, + watch: { + 'payments': function () { + EventHub.$emit('update-wallet-balance', [this.w.wallet.id, this.balance]); } }, created: function () { diff --git a/lnbits/core/templates/core/index.html b/lnbits/core/templates/core/index.html index 5908129b..dd56cede 100644 --- a/lnbits/core/templates/core/index.html +++ b/lnbits/core/templates/core/index.html @@ -57,10 +57,10 @@ View project in GitHub Donate diff --git a/lnbits/core/templates/core/wallet.html b/lnbits/core/templates/core/wallet.html index 25fecbb0..bde0bc53 100644 --- a/lnbits/core/templates/core/wallet.html +++ b/lnbits/core/templates/core/wallet.html @@ -54,7 +54,7 @@
Transactions
- Export to CSV + Export to CSV @@ -64,7 +64,7 @@
@@ -122,40 +122,44 @@ label="API info" :content-inset-level="0.5" > - + - Generate an invoice:
POST /api/v1/invoices
Header + POST /api/v1/payments +
Headers
{"Grpc-Metadata-macaroon": "{{ wallet.inkey }}"}
- Body {"value": "200","memo": "beer"}
- Returns - {"pay_req": string,"pay_id": string}
- *payment will not register in the wallet until the "check - invoice" endpoint is used

- - Check invoice:
- Check an invoice:
GET /api/v1/invoice/*payment_hash*
Header - {"Grpc-Metadata-macaroon": "{{ wallet.inkey }}"}
- - Returns - {"PAID": "TRUE"}/{"PAID": "FALSE"}
- *if using LNTXBOT return will hang until paid

+
Body (application/json)
+ {"out": false, "value": <int>, "memo": <string>} +
Returns 201 CREATED (application/json)
+ {"checking_id": <string>, "payment_request": <string>}
- + - This whole wallet will be deleted, the funds will be UNRECOVERABLE. + POST /api/v1/payments +
Headers
+ {"Grpc-Metadata-macaroon": "{{ wallet.adminkey }}"} +
Body (application/json)
+ {"out": true, "bolt11": <string>} +
Returns 201 CREATED (application/json)
+ {"checking_id": <string>} +
+
+
+ + + + GET /api/v1/payments/<checking_id> +
Headers
+ {"Grpc-Metadata-macaroon": "{{ wallet.inkey }}"} +
Returns 200 OK (application/json)
+ {"paid": <bool>}
diff --git a/lnbits/core/views/api.py b/lnbits/core/views/api.py index fff7074d..c39d86af 100644 --- a/lnbits/core/views/api.py +++ b/lnbits/core/views/api.py @@ -45,7 +45,7 @@ def api_payments_create_invoice(): return jsonify({"checking_id": checking_id, "payment_request": payment_request}), Status.CREATED -@api_check_wallet_macaroon(key_type="invoice") +@api_check_wallet_macaroon(key_type="admin") @api_validate_post_request(required_params=["bolt11"]) def api_payments_pay_invoice(): if not isinstance(g.data["bolt11"], str) or not g.data["bolt11"].strip(): diff --git a/lnbits/static/js/base.js b/lnbits/static/js/base.js index f93385f8..b0cd78b9 100644 --- a/lnbits/static/js/base.js +++ b/lnbits/static/js/base.js @@ -1,5 +1,7 @@ var LOCALE = 'en' +var EventHub = new Vue(); + var LNbits = { api: { request: function (method, url, macaroon, data) { @@ -20,7 +22,7 @@ var LNbits = { }); }, payInvoice: function (wallet, bolt11) { - return this.request('post', '/api/v1/payments', wallet.inkey, { + return this.request('post', '/api/v1/payments', wallet.adminkey, { out: true, bolt11: bolt11 }); @@ -53,7 +55,7 @@ var LNbits = { obj.wallets = obj.wallets.map(function (obj) { return mapWallet(obj); }).sort(function (a, b) { - return a.name > b.name; + return a.name.localeCompare(b.name); }); return obj; }, @@ -94,6 +96,44 @@ var LNbits = { caption: [error.response.status, ' ', error.response.statusText].join('').toUpperCase() || null, icon: null }); + }, + exportCSV: function (columns, data) { + var wrapCsvValue = function(val, formatFn) { + var formatted = formatFn !== void 0 + ? formatFn(val) + : val; + + formatted = (formatted === void 0 || formatted === null) + ? '' + : String(formatted); + + formatted = formatted.split('"').join('""'); + + return `"${formatted}"`; + } + + var content = [columns.map(function (col) { + return wrapCsvValue(col.label); + })].concat(data.map(function (row) { + return columns.map(function (col) { + return wrapCsvValue( + (typeof col.field === 'function') + ? col.field(row) + : row[(col.field === void 0) ? col.name : col.field], + col.format + ); + }).join(','); + })).join('\r\n'); + + var status = Quasar.utils.exportFile('table-export.csv', content, 'text/csv'); + + if (status !== true) { + Quasar.plugins.Notify.create({ + message: 'Browser denied file download...', + color: 'negative', + icon: null + }); + } } } }; diff --git a/lnbits/static/js/components.js b/lnbits/static/js/components.js index 615ee68b..79767eda 100644 --- a/lnbits/static/js/components.js +++ b/lnbits/static/js/components.js @@ -3,6 +3,7 @@ Vue.component('lnbits-wallet-list', { return { user: null, activeWallet: null, + activeBalance: [], showForm: false, walletName: '' } @@ -10,7 +11,7 @@ Vue.component('lnbits-wallet-list', { template: ` Wallets - @@ -25,7 +26,7 @@ Vue.component('lnbits-wallet-list', { {{ wallet.name }} - {{ wallet.fsat }} sat + {{ wallet.live_fsat }} sat @@ -41,7 +42,7 @@ Vue.component('lnbits-wallet-list', { - +