From eaac245f4e6c3718362041c8e24e340ec4a0988f Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Thu, 9 Jul 2020 15:14:09 +0200 Subject: [PATCH] WIP Basic reimbursement lists --- .../reimbursement-list/component.js | 7 ++ .../reimbursement-list/template.hbs | 14 +++ app/controllers/budget.js | 10 ++ app/styles/_layout.scss | 16 +++ app/templates/budget.hbs | 114 ++++++++++-------- app/utils/process-reimbursement-data.js | 6 +- config/environment.js | 4 + package-lock.json | 111 ++++++++--------- package.json | 2 +- .../reimbursement-list/component-test.js | 26 ++++ tests/unit/controllers/budget-test.js | 12 ++ 11 files changed, 212 insertions(+), 110 deletions(-) create mode 100644 app/components/reimbursement-list/component.js create mode 100644 app/components/reimbursement-list/template.hbs create mode 100644 app/controllers/budget.js create mode 100644 tests/integration/components/reimbursement-list/component-test.js create mode 100644 tests/unit/controllers/budget-test.js diff --git a/app/components/reimbursement-list/component.js b/app/components/reimbursement-list/component.js new file mode 100644 index 0000000..6f2b5cb --- /dev/null +++ b/app/components/reimbursement-list/component.js @@ -0,0 +1,7 @@ +import Component from '@glimmer/component'; +import { sort } from '@ember/object/computed'; + +export default class ReimbursementListComponent extends Component { + itemSorting = Object.freeze(['id:desc']); + @sort('args.items', 'itemSorting') itemsSorted; +} diff --git a/app/components/reimbursement-list/template.hbs b/app/components/reimbursement-list/template.hbs new file mode 100644 index 0000000..0ef5075 --- /dev/null +++ b/app/components/reimbursement-list/template.hbs @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/app/controllers/budget.js b/app/controllers/budget.js new file mode 100644 index 0000000..f932b83 --- /dev/null +++ b/app/controllers/budget.js @@ -0,0 +1,10 @@ +import Controller from '@ember/controller'; +import { inject as service } from '@ember/service'; +import { alias } from '@ember/object/computed'; + +export default class BudgetController extends Controller { + @service kredits; + + @alias('kredits.reimbursementsUnconfirmed') reimbursementsUnconfirmed; + @alias('kredits.reimbursementsConfirmed') reimbursementsConfirmed; +} diff --git a/app/styles/_layout.scss b/app/styles/_layout.scss index 23be5fa..ce31120 100644 --- a/app/styles/_layout.scss +++ b/app/styles/_layout.scss @@ -14,6 +14,15 @@ main { "contributions"; } + &#budget { + width: 100%; + display: grid; + grid-row-gap: 2rem; + grid-template-areas: + "aside" + "content"; + } + &.center-column { display: flex; flex-direction: column; @@ -111,6 +120,13 @@ main { "stats contributions details"; } } + + &#budget { + grid-column-gap: 3rem; + grid-template-columns: 2fr 4fr 2fr; + grid-template-areas: + "aside content empty"; + } } } diff --git a/app/templates/budget.hbs b/app/templates/budget.hbs index 7f31770..80dd73d 100644 --- a/app/templates/budget.hbs +++ b/app/templates/budget.hbs @@ -1,55 +1,73 @@
- +
+ -
-
-

Community funds

-
-
- - - - - - - - - - - - - - - - - - - - -
TokenAmountFiat value
WBTC1.1721511031.15 USD
ETH0.5115.60 USD
-
-
+
+
+

Community funds

+
+
+ + + + + + + + + + + + + + + + + + + + +
TokenAmountFiat value
WBTC1.1721511031.15 USD
ETH0.5115.60 USD
+
+
+
- {{!-- TODO #if sub-route (i.e. filtered list) --}} - {{!-- {{outlet}} --}} - {{!-- {{else}} --}} +
+
+
+

Proposed Reimbursements

+
+
+ +
+
-
-
+
+
+

Confirmed Expenses

+
+
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/app/utils/process-reimbursement-data.js b/app/utils/process-reimbursement-data.js index a0b9399..a66287c 100644 --- a/app/utils/process-reimbursement-data.js +++ b/app/utils/process-reimbursement-data.js @@ -1,5 +1,7 @@ export default function processReimbursementData(data) { - const processed = {} + const processed = { + amount: data.amount.toNumber() + } if (data.confirmedAtBlock && (typeof data.confirmedAtBlock.toNumber === 'function')) { processed.confirmedAt = data.confirmedAtBlock.toNumber(); @@ -8,7 +10,7 @@ export default function processReimbursementData(data) { } const otherProperties = [ - 'id', 'contributorId', 'token', 'amount', 'vetoed', 'ipfsHash', + 'id', 'contributorId', 'token', 'vetoed', 'ipfsHash', 'expenses', 'pendingTx' ]; diff --git a/config/environment.js b/config/environment.js index 3554ed2..e2c59ea 100644 --- a/config/environment.js +++ b/config/environment.js @@ -46,6 +46,10 @@ module.exports = function(environment) { port: '5444', protocol: 'https', gatewayUrl: 'https://ipfs.kosmos.org/ipfs' + }, + + tokens: { + 'WBTC': '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599' } }; diff --git a/package-lock.json b/package-lock.json index 39f3526..4669c89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2938,8 +2938,9 @@ "dev": true }, "@kosmos/schemas": { - "version": "github:67P/kosmos-schemas#67cc3d9d746c93907a68a7b6283bb914c283a612", - "from": "github:67P/kosmos-schemas#feature/browser-compat", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@kosmos/schemas/-/schemas-3.0.0.tgz", + "integrity": "sha512-7hnirq0ShsDjENBPjNnu6izwzVjkDzEZ4SKvPzQJJfkeJ/NRVHKvfdn9rkE7CRXTi2hMzsZVFOnlF6D/eYXTCA==", "dev": true, "requires": { "brfs-babel": "^1.0.0" @@ -6759,13 +6760,6 @@ "to-regex-range": "^5.0.1" } }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -10890,6 +10884,39 @@ "ms": "^2.1.1" } }, + "ember-get-config": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/ember-get-config/-/ember-get-config-0.2.4.tgz", + "integrity": "sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0=", + "dev": true, + "requires": { + "broccoli-file-creator": "^1.1.1", + "ember-cli-babel": "^6.3.0" + }, + "dependencies": { + "ember-cli-babel": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz", + "integrity": "sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA==", + "dev": true, + "requires": { + "amd-name-resolver": "1.2.0", + "babel-plugin-debug-macros": "^0.2.0-beta.6", + "babel-plugin-ember-modules-api-polyfill": "^2.6.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "broccoli-babel-transpiler": "^6.5.0", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.1.2", + "semver": "^5.5.0" + } + } + } + }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", @@ -11830,39 +11857,6 @@ } } }, - "ember-get-config": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/ember-get-config/-/ember-get-config-0.2.4.tgz", - "integrity": "sha1-EYSSoqA9c+RgBO13eSiUICH+Hs0=", - "dev": true, - "requires": { - "broccoli-file-creator": "^1.1.1", - "ember-cli-babel": "^6.3.0" - }, - "dependencies": { - "ember-cli-babel": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz", - "integrity": "sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA==", - "dev": true, - "requires": { - "amd-name-resolver": "1.2.0", - "babel-plugin-debug-macros": "^0.2.0-beta.6", - "babel-plugin-ember-modules-api-polyfill": "^2.6.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.0", - "babel-polyfill": "^6.26.0", - "babel-preset-env": "^1.7.0", - "broccoli-babel-transpiler": "^6.5.0", - "broccoli-debug": "^0.6.4", - "broccoli-funnel": "^2.0.0", - "broccoli-source": "^1.1.0", - "clone": "^2.0.0", - "ember-cli-version-checker": "^2.1.2", - "semver": "^5.5.0" - } - } - } - }, "ember-getowner-polyfill": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz", @@ -16494,15 +16488,11 @@ "dev": true }, "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -18606,11 +18596,11 @@ "dev": true }, "kredits-contracts": { - "version": "github:67P/kredits-contracts#17cc44cb981074b32b7732744ce5699949fc1f2f", + "version": "github:67P/kredits-contracts#c63fcc002b05c5907d3f1ebd9487ee074e80d6e9", "from": "github:67P/kredits-contracts#feature/expenses", "dev": true, "requires": { - "@kosmos/schemas": "github:67P/kosmos-schemas#feature/browser-compat", + "@kosmos/schemas": "^3.0.0", "ethers": "^4.0.47", "ipfs-http-client": "^41.0.1", "node-fetch": "^2.6.0", @@ -20303,13 +20293,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -25437,6 +25420,16 @@ "upath": "^1.1.1" } }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/package.json b/package.json index 6d8313d..dc7b99c 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@ember/optional-features": "^1.3.0", "@glimmer/component": "^1.0.0", "@glimmer/tracking": "^1.0.0", - "@kosmos/schemas": "github:67P/kosmos-schemas#feature/browser-compat", + "@kosmos/schemas": "^3.0.0", "babel-eslint": "^10.1.0", "babel-preset-es2015": "^6.22.0", "babelify": "^7.3.0", diff --git a/tests/integration/components/reimbursement-list/component-test.js b/tests/integration/components/reimbursement-list/component-test.js new file mode 100644 index 0000000..0e8114a --- /dev/null +++ b/tests/integration/components/reimbursement-list/component-test.js @@ -0,0 +1,26 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Component | reimbursement-list', function(hooks) { + setupRenderingTest(hooks); + + test('it renders', async function(assert) { + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.set('myAction', function(val) { ... }); + + await render(hbs``); + + assert.equal(this.element.textContent.trim(), ''); + + // Template block usage: + await render(hbs` + + template block text + + `); + + assert.equal(this.element.textContent.trim(), 'template block text'); + }); +}); diff --git a/tests/unit/controllers/budget-test.js b/tests/unit/controllers/budget-test.js new file mode 100644 index 0000000..ec61054 --- /dev/null +++ b/tests/unit/controllers/budget-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Controller | budget', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let controller = this.owner.lookup('controller:budget'); + assert.ok(controller); + }); +});