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 @@
+
+ {{#each this.itemsSorted as |reimbursement|}}
+ -
+ {{reimbursement.id}}
+ {{reimbursement.amount}} WBTC
+ vetoed: {{reimbursement.vetoed}}
+ pay out to: {{reimbursement.contributor.name}}
+
+ {{#each reimbursement.expenses as |expense|}}
+ {{expense.date}}: {{expense.title}}
+ {{/each}}
+
+ {{/each}}
+
\ 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 @@
-
+
+
-
-
-
-
-
-
- | Token |
- Amount |
- Fiat value |
-
-
-
-
- | WBTC |
- 1.17215 |
- 11031.15 USD |
-
-
- | ETH |
- 0.5 |
- 115.60 USD |
-
-
-
-
-
+
+
+
+
+
+
+ | Token |
+ Amount |
+ Fiat value |
+
+
+
+
+ | WBTC |
+ 1.17215 |
+ 11031.15 USD |
+
+
+ | ETH |
+ 0.5 |
+ 115.60 USD |
+
+
+
+
+
+
- {{!-- TODO #if sub-route (i.e. filtered list) --}}
- {{!-- {{outlet}} --}}
- {{!-- {{else}} --}}
+
+
+
+ Proposed Reimbursements
+
+
+
+
+
-
+
+
+
+
+
\ 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);
+ });
+});