Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
8c5c6b7c6b
|
|||
|
77f95a096a
|
|||
|
4bd6bc8269
|
@@ -27,10 +27,6 @@ export default class AddReimbursementComponent extends Component {
|
|||||||
this.exchangeRates.fetchRates();
|
this.exchangeRates.fetchRates();
|
||||||
}
|
}
|
||||||
|
|
||||||
get contributorId () {
|
|
||||||
return this.recipientId || this.kredits.currentUser?.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
get isValidTotal () {
|
get isValidTotal () {
|
||||||
return isValidAmount(this.total);
|
return isValidAmount(this.total);
|
||||||
}
|
}
|
||||||
@@ -74,7 +70,7 @@ export default class AddReimbursementComponent extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateTotalAmountFromFiat() {
|
updateTotalAmountFromFiat() {
|
||||||
let btcAmount = 0;
|
let btcAmount = parseFloat(this.total);
|
||||||
|
|
||||||
if (this.exchangeRates.btceur > 0 && this.totalEUR > 0) {
|
if (this.exchangeRates.btceur > 0 && this.totalEUR > 0) {
|
||||||
btcAmount += (this.totalEUR / this.exchangeRates.btceur);
|
btcAmount += (this.totalEUR / this.exchangeRates.btceur);
|
||||||
@@ -108,7 +104,7 @@ export default class AddReimbursementComponent extends Component {
|
|||||||
|
|
||||||
@action
|
@action
|
||||||
updateContributor (event) {
|
updateContributor (event) {
|
||||||
this.recipientId = parseInt(event.target.value);
|
this.recipientId = event.target.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@@ -140,12 +136,12 @@ export default class AddReimbursementComponent extends Component {
|
|||||||
if (!this.kredits.currentUser) { window.alert('You need to connect your RSK account first.'); return false }
|
if (!this.kredits.currentUser) { window.alert('You need to connect your RSK account first.'); return false }
|
||||||
if (!this.kredits.currentUserIsCore) { window.alert('Only core contributors can submit reimbursements.'); return false }
|
if (!this.kredits.currentUserIsCore) { window.alert('Only core contributors can submit reimbursements.'); return false }
|
||||||
|
|
||||||
const contributor = this.contributors.findBy('id', this.contributorId);
|
const contributor = this.contributors.findBy('id', parseInt(this.recipientId));
|
||||||
|
|
||||||
const attributes = {
|
const attributes = {
|
||||||
amount: parseInt(parseFloat(this.total) * 100000000), // convert to sats
|
amount: parseInt(parseFloat(this.total) * 100000000), // convert to sats
|
||||||
token: config.tokens['BTC'],
|
token: config.tokens['BTC'],
|
||||||
recipientId: this.contributorId,
|
recipientId: parseInt(this.recipientId),
|
||||||
title: `Expenses covered by ${contributor.name}`,
|
title: `Expenses covered by ${contributor.name}`,
|
||||||
description: this.description,
|
description: this.description,
|
||||||
url: this.url,
|
url: this.url,
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
<label>
|
<label>
|
||||||
<p class="label">Contributor:</p>
|
<p class="label">Contributor:</p>
|
||||||
<p>
|
<p>
|
||||||
<select id="contributor" required {{on "change" this.updateContributor}}>
|
<select required {{on "change" this.updateContributor}}>
|
||||||
|
<option value="" selected disabled hidden></option>
|
||||||
{{#each this.contributors as |contributor|}}
|
{{#each this.contributors as |contributor|}}
|
||||||
<option value={{contributor.id}} selected={{eq this.contributorId contributor.id}}>{{contributor.name}}</option>
|
<option value={{contributor.id}} selected={{eq this.contributorId contributor.id}}>{{contributor.name}}</option>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
@@ -14,7 +15,6 @@
|
|||||||
<p class="label">Total amount (BTC):</p>
|
<p class="label">Total amount (BTC):</p>
|
||||||
<p>
|
<p>
|
||||||
<Input @type="text"
|
<Input @type="text"
|
||||||
@name="total-btc"
|
|
||||||
@placeholder="0.0015"
|
@placeholder="0.0015"
|
||||||
@value={{this.total}}
|
@value={{this.total}}
|
||||||
@required={{true}}
|
@required={{true}}
|
||||||
@@ -50,9 +50,7 @@
|
|||||||
|
|
||||||
<p class="actions">
|
<p class="actions">
|
||||||
<button {{on "click" this.showExpenseForm}}
|
<button {{on "click" this.showExpenseForm}}
|
||||||
id="add-another-item" class="green small" type="button">
|
class="green small" type="button">+ Add another item</button>
|
||||||
+ Add another item
|
|
||||||
</button>
|
|
||||||
</p>
|
</p>
|
||||||
{{else}}
|
{{else}}
|
||||||
<p>No line items yet.</p>
|
<p>No line items yet.</p>
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
{{#if this.isConfirmed}}
|
{{#unless this.isConfirmed}}
|
||||||
Confirmed at block <strong>{{@confirmedAtBlock}}</strong> (~ {{this.confirmedInHumanTime}} ago)
|
|
||||||
{{else}}
|
|
||||||
Confirming in <strong>{{this.confirmedInBlocks}}</strong> blocks (~ {{this.confirmedInHumanTime}})
|
Confirming in <strong>{{this.confirmedInBlocks}}</strong> blocks (~ {{this.confirmedInHumanTime}})
|
||||||
{{/if}}
|
{{/unless}}
|
||||||
|
|||||||
@@ -1,20 +1,10 @@
|
|||||||
import Component from '@glimmer/component';
|
import Component from '@glimmer/component';
|
||||||
import { action } from '@ember/object';
|
import { action } from '@ember/object';
|
||||||
import { tracked } from '@glimmer/tracking';
|
|
||||||
import { inject as service } from '@ember/service';
|
import { inject as service } from '@ember/service';
|
||||||
import config from 'kredits-web/config/environment';
|
import config from 'kredits-web/config/environment';
|
||||||
import fmtDateLocalized from 'kredits-web/helpers/fmt-date-localized';
|
|
||||||
|
|
||||||
export default class ReimbursementItemComponent extends Component {
|
export default class ReimbursementItemComponent extends Component {
|
||||||
@service kredits;
|
@service kredits;
|
||||||
@tracked showExpenseDetails = false;
|
|
||||||
|
|
||||||
constructor(owner, args) {
|
|
||||||
super(owner, args);
|
|
||||||
if (this.isUnconfirmed && !this.isVetoed) {
|
|
||||||
this.showExpenseDetails = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get ipfsGatewayUrl () {
|
get ipfsGatewayUrl () {
|
||||||
return config.ipfs.gatewayUrl;
|
return config.ipfs.gatewayUrl;
|
||||||
@@ -28,37 +18,10 @@ export default class ReimbursementItemComponent extends Component {
|
|||||||
return !this.isConfirmed;
|
return !this.isConfirmed;
|
||||||
}
|
}
|
||||||
|
|
||||||
get isVetoed () {
|
|
||||||
return this.args.reimbursement.vetoed;
|
|
||||||
}
|
|
||||||
|
|
||||||
get showVetoButton () {
|
get showVetoButton () {
|
||||||
return this.isUnconfirmed && this.kredits.currentUserIsCore;
|
return this.isUnconfirmed && this.kredits.currentUserIsCore;
|
||||||
}
|
}
|
||||||
|
|
||||||
get showConfirmedIn () {
|
|
||||||
return !this.isVetoed &&
|
|
||||||
(this.showExpenseDetails || this.isUnconfirmed);
|
|
||||||
}
|
|
||||||
|
|
||||||
get expenses () {
|
|
||||||
return this.args.reimbursement.expenses;
|
|
||||||
}
|
|
||||||
|
|
||||||
get expensesDateRange () {
|
|
||||||
const dates = this.expenses.map(e => e.date).uniq().sort();
|
|
||||||
let out = fmtDateLocalized.compute(dates.firstObject)
|
|
||||||
if (dates.length > 1) {
|
|
||||||
out += ' - ' + fmtDateLocalized.compute(dates.lastObject)
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
@action
|
|
||||||
toggleExpenseDetails () {
|
|
||||||
this.showExpenseDetails = !this.showExpenseDetails;
|
|
||||||
}
|
|
||||||
|
|
||||||
@action
|
@action
|
||||||
veto (id) {
|
veto (id) {
|
||||||
this.kredits.vetoReimbursement(id).then(transaction => {
|
this.kredits.vetoReimbursement(id).then(transaction => {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<li data-reimbursement-id={{@reimbursement.id}}
|
<li data-reimbursement-id={{@reimbursement.id}}
|
||||||
class="{{item-status @reimbursement}}"
|
class="{{item-status @reimbursement}}">
|
||||||
role="button" {{on "click" this.toggleExpenseDetails}}>
|
|
||||||
<p class="meta">
|
<p class="meta">
|
||||||
<span class="recipient">
|
<span class="recipient">
|
||||||
<UserAvatar @contributor={{@reimbursement.contributor}} />
|
<UserAvatar @contributor={{@reimbursement.contributor}} />
|
||||||
@@ -14,17 +13,11 @@
|
|||||||
{{sats-to-btc @reimbursement.amount}}</span> <span class="symbol">BTC</span>
|
{{sats-to-btc @reimbursement.amount}}</span> <span class="symbol">BTC</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{{#if this.showExpenseDetails}}
|
|
||||||
<ExpenseList @expenses={{@reimbursement.expenses}} />
|
<ExpenseList @expenses={{@reimbursement.expenses}} />
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
<p>
|
<p class="confirmation-eta">
|
||||||
{{#if this.showConfirmedIn}}
|
|
||||||
<ConfirmedIn @confirmedAtBlock={{@reimbursement.confirmedAt}} />
|
<ConfirmedIn @confirmedAtBlock={{@reimbursement.confirmedAt}} />
|
||||||
{{else}}
|
|
||||||
{{#unless this.isVetoed}}{{this.expensesDateRange}}{{/unless}}
|
|
||||||
{{/if}}
|
|
||||||
</p>
|
</p>
|
||||||
<p class="actions">
|
<p class="actions">
|
||||||
<a href="{{this.ipfsGatewayUrl}}/{{@reimbursement.ipfsHash}}"
|
<a href="{{this.ipfsGatewayUrl}}/{{@reimbursement.ipfsHash}}"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<ul class="item-list collapsible spaced reimbursement-list {{if @loading 'loading'}}">
|
<ul class="item-list spaced reimbursement-list {{if @loading 'loading'}}">
|
||||||
{{#each this.itemsSorted as |item|}}
|
{{#each this.itemsSorted as |item|}}
|
||||||
<ReimbursementItem @reimbursement={{item}} />
|
<ReimbursementItem @reimbursement={{item}} />
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|||||||
@@ -1,26 +1,10 @@
|
|||||||
import Controller from '@ember/controller';
|
import Controller from '@ember/controller';
|
||||||
import { inject as service } from '@ember/service';
|
import { inject as service } from '@ember/service';
|
||||||
import { alias } from '@ember/object/computed';
|
import { alias } from '@ember/object/computed';
|
||||||
import { action } from '@ember/object';
|
|
||||||
|
|
||||||
export default class BudgetController extends Controller {
|
export default class BudgetController extends Controller {
|
||||||
@service kredits;
|
@service kredits;
|
||||||
@service router;
|
|
||||||
|
|
||||||
@alias('kredits.reimbursementsUnconfirmed') reimbursementsUnconfirmed;
|
@alias('kredits.reimbursementsUnconfirmed') reimbursementsUnconfirmed;
|
||||||
@alias('kredits.reimbursementsConfirmed') reimbursementsConfirmed;
|
@alias('kredits.reimbursementsConfirmed') reimbursementsConfirmed;
|
||||||
@alias('kredits.currentUserIsCore') currentUserIsCore;
|
|
||||||
|
|
||||||
@action
|
|
||||||
addReimbursement () {
|
|
||||||
if (!this.kredits.currentUser) {
|
|
||||||
window.alert('You need to connect your RSK account first.');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!this.kredits.currentUserIsCore) {
|
|
||||||
window.alert('Only core contributors can submit reimbursements.');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.router.transitionTo('reimbursements.new');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { helper } from '@ember/component/helper';
|
import { helper } from '@ember/component/helper';
|
||||||
import getLocale from 'kredits-web/utils/get-locale';
|
import getLocale from 'kredits-web/utils/get-locale';
|
||||||
|
|
||||||
export default helper(function fmtDateLocalized(dateStr) {
|
export default helper(function(dateStr) {
|
||||||
const date = new Date(dateStr);
|
const date = new Date(dateStr);
|
||||||
const locale = getLocale();
|
const locale = getLocale();
|
||||||
return new Intl.DateTimeFormat(locale).format(date);
|
return new Intl.DateTimeFormat(locale).format(date);
|
||||||
|
|||||||
@@ -30,5 +30,8 @@ export default class BudgetRoute extends Route {
|
|||||||
}
|
}
|
||||||
schedule('afterRender', this.kredits.fetchMissingReimbursements,
|
schedule('afterRender', this.kredits.fetchMissingReimbursements,
|
||||||
this.kredits.fetchMissingReimbursements.perform);
|
this.kredits.fetchMissingReimbursements.perform);
|
||||||
|
|
||||||
|
schedule('afterRender', this.kredits.syncReimbursementEvents,
|
||||||
|
this.kredits.syncReimbursementEvents.perform);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -780,5 +780,32 @@ export default Service.extend({
|
|||||||
this.contributors
|
this.contributors
|
||||||
.findBy('address', to)
|
.findBy('address', to)
|
||||||
.incrementProperty('balance', value);
|
.incrementProperty('balance', value);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
syncReimbursementEvents: task(function * () {
|
||||||
|
yield this.fetchEvents(
|
||||||
|
'Reimbursement', // contract
|
||||||
|
'ReimbursementAdded', // event
|
||||||
|
0,
|
||||||
|
// this.kredits.currentBlock - (2*60*24*14), // from block
|
||||||
|
this.currentBlock // to block
|
||||||
|
);
|
||||||
|
}).group('syncTaskGroup'),
|
||||||
|
|
||||||
|
async fetchEvents(contractName, eventName, fromBlock, toBlock) {
|
||||||
|
const contract = this.kredits[contractName].contract;
|
||||||
|
const eventFilter = contract.filters[eventName]();
|
||||||
|
const filterOptions = { fromBlock, toBlock };
|
||||||
|
|
||||||
|
console.debug(contract, eventFilter, filterOptions);
|
||||||
|
contract.queryFilter(eventFilter)
|
||||||
|
.then(events => {
|
||||||
|
events.forEach(event => {
|
||||||
|
console.debug("Event:", event.args.creator, event.args.key, event.args.value);
|
||||||
|
});
|
||||||
|
}).catch(e => {
|
||||||
|
console.error(e);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -16,16 +16,6 @@ ul.item-list {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.collapsible {
|
|
||||||
> li {
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
border-left: 1px solid $blue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.loading {
|
&.loading {
|
||||||
@include loading-border-top;
|
@include loading-border-top;
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ ul.reimbursement-list {
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
padding: 1.6rem 0 1rem 0;
|
padding: 1.6rem 0 1rem 0;
|
||||||
|
|
||||||
|
&.confirmation-eta {
|
||||||
|
}
|
||||||
|
|
||||||
&.actions {
|
&.actions {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-10
@@ -1,6 +1,22 @@
|
|||||||
<main id="budget">
|
<main id="budget">
|
||||||
|
|
||||||
<div id="aside">
|
<div id="aside">
|
||||||
|
<!-- <section id="main-nav"> -->
|
||||||
|
<!-- <header> -->
|
||||||
|
<!-- <h2>Budget</h2> -->
|
||||||
|
<!-- </header> -->
|
||||||
|
<!-- <div class="content"> -->
|
||||||
|
<!-- <ul> -->
|
||||||
|
<!-- <li> -->
|
||||||
|
<!-- <LinkTo @route="budget.expenses">Expenses</LinkTo> -->
|
||||||
|
<!-- </li> -->
|
||||||
|
<!-- <li> -->
|
||||||
|
<!-- <a href="#">Rewards</a> -->
|
||||||
|
<!-- </li> -->
|
||||||
|
<!-- </ul> -->
|
||||||
|
<!-- </div> -->
|
||||||
|
<!-- </section> -->
|
||||||
|
|
||||||
<section id="funds">
|
<section id="funds">
|
||||||
<header>
|
<header>
|
||||||
<h2>Community funds</h2>
|
<h2>Community funds</h2>
|
||||||
@@ -17,11 +33,7 @@
|
|||||||
<header class="with-nav">
|
<header class="with-nav">
|
||||||
<h2>Proposed Reimbursements</h2>
|
<h2>Proposed Reimbursements</h2>
|
||||||
<nav>
|
<nav>
|
||||||
<button type="button" class="button small green"
|
<LinkTo @route="reimbursements.new" @title="Submit a reimbursement" class="button small green">add</LinkTo>
|
||||||
title="Submit a reimbursement"
|
|
||||||
{{on "click" this.addReimbursement}}>
|
|
||||||
add
|
|
||||||
</button>
|
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
@@ -35,11 +47,7 @@
|
|||||||
<header class="with-nav">
|
<header class="with-nav">
|
||||||
<h2>Confirmed Reimbursements</h2>
|
<h2>Confirmed Reimbursements</h2>
|
||||||
<nav>
|
<nav>
|
||||||
<button type="button" class="button small green"
|
<LinkTo @route="reimbursements.new" @title="Submit a reimbursement" class="button small green">add</LinkTo>
|
||||||
title="Submit a reimbursement"
|
|
||||||
{{on "click" this.addReimbursement}}>
|
|
||||||
add
|
|
||||||
</button>
|
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
|
|||||||
@@ -62,7 +62,9 @@ module.exports = function(environment) {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
corsProxy: 'https://cors.5apps.com/?uri='
|
corsProxy: 'https://cors.5apps.com/?uri=',
|
||||||
|
|
||||||
|
hideVetoedEntriesAfterBlocks: 5760 // 48 hours
|
||||||
};
|
};
|
||||||
|
|
||||||
if (environment === 'development') {
|
if (environment === 'development') {
|
||||||
|
|||||||
Generated
+6
-13
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "kredits-web",
|
"name": "kredits-web",
|
||||||
"version": "2.2.1",
|
"version": "2.1.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "kredits-web",
|
"name": "kredits-web",
|
||||||
"version": "2.2.1",
|
"version": "2.1.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "^7.19.1",
|
"@babel/eslint-parser": "^7.19.1",
|
||||||
@@ -6816,9 +6816,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001599",
|
"version": "1.0.30001332",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz",
|
|
||||||
"integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==",
|
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -6828,12 +6826,9 @@
|
|||||||
{
|
{
|
||||||
"type": "tidelift",
|
"type": "tidelift",
|
||||||
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
|
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/ai"
|
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"license": "CC-BY-4.0"
|
||||||
},
|
},
|
||||||
"node_modules/capture-exit": {
|
"node_modules/capture-exit": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
@@ -29055,9 +29050,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001599",
|
"version": "1.0.30001332",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz",
|
|
||||||
"integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==",
|
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"capture-exit": {
|
"capture-exit": {
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "kredits-web",
|
"name": "kredits-web",
|
||||||
"version": "2.2.1",
|
"version": "2.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Contribution dashboard of the Kosmos project",
|
"description": "Contribution dashboard of the Kosmos project",
|
||||||
"repository": "https://github.com/67P/kredits-web",
|
"repository": "https://github.com/67P/kredits-web",
|
||||||
|
|||||||
+66
-89
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+3
-3
@@ -8,10 +8,10 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
|
|
||||||
|
|
||||||
<meta name="kredits-web/config/environment" content="%7B%22modulePrefix%22%3A%22kredits-web%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%22%2C%22locationType%22%3A%22auto%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_DEFAULT_ASYNC_OBSERVERS%22%3Atrue%2C%22_JQUERY_INTEGRATION%22%3Afalse%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22name%22%3A%22kredits-web%22%2C%22version%22%3A%222.2.1%2Bb32f805c%22%7D%2C%22web3ProviderUrl%22%3A%22https%3A%2F%2Frsk-testnet.kosmos.org%22%2C%22web3ChainId%22%3A31%2C%22web3NetworkName%22%3A%22RSK%20Testnet%22%2C%22githubConnectUrl%22%3A%22https%3A%2F%2Fhal8000.kosmos.chat%2Fkredits%2Fsignup%2Fconnect%2Fgithub%22%2C%22githubSignupUrl%22%3A%22https%3A%2F%2Fhal8000.kosmos.chat%2Fkredits%2Fsignup%2Fgithub%22%2C%22ipfs%22%3A%7B%22host%22%3A%22ipfs.kosmos.org%22%2C%22port%22%3A%225444%22%2C%22protocol%22%3A%22https%22%2C%22gatewayUrl%22%3A%22https%3A%2F%2Fipfs.kosmos.org%2Fipfs%22%7D%2C%22tokens%22%3A%7B%22BTC%22%3A%220x2260fac5e5542a773aa44fbcfedf7c193bc2c599%22%7D%2C%22communityFundsAPI%22%3A%7B%22balances%22%3A%7B%22onchain%22%3A%7B%22icon%22%3A%22icon-btc.png%22%2C%22symbol%22%3A%22BTC%22%2C%22description%22%3A%22BTC%20on%20chain%22%2C%22url%22%3A%22https%3A%2F%2Fapi.kosmos.org%2Fbtcpay%2Fonchain_btc_balance%22%7D%2C%22lightning%22%3A%7B%22icon%22%3A%22icon-btc-lightning.png%22%2C%22symbol%22%3A%22BTC%22%2C%22description%22%3A%22BTC%20on%20Lightning%20Network%22%2C%22url%22%3A%22https%3A%2F%2Fapi.kosmos.org%2Fbtcpay%2Flightning_btc_balance%22%7D%7D%7D%2C%22corsProxy%22%3A%22https%3A%2F%2Fcors.5apps.com%2F%3Furi%3D%22%2C%22exportApplicationGlobal%22%3Afalse%7D" />
|
<meta name="kredits-web/config/environment" content="%7B%22modulePrefix%22%3A%22kredits-web%22%2C%22environment%22%3A%22production%22%2C%22rootURL%22%3A%22%2F%22%2C%22locationType%22%3A%22auto%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_DEFAULT_ASYNC_OBSERVERS%22%3Atrue%2C%22_JQUERY_INTEGRATION%22%3Afalse%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22name%22%3A%22kredits-web%22%2C%22version%22%3A%222.1.1%2B5c9fbf50%22%7D%2C%22web3ProviderUrl%22%3A%22https%3A%2F%2Frsk-testnet.kosmos.org%22%2C%22web3ChainId%22%3A31%2C%22web3NetworkName%22%3A%22RSK%20Testnet%22%2C%22githubConnectUrl%22%3A%22https%3A%2F%2Fhal8000.kosmos.chat%2Fkredits%2Fsignup%2Fconnect%2Fgithub%22%2C%22githubSignupUrl%22%3A%22https%3A%2F%2Fhal8000.kosmos.chat%2Fkredits%2Fsignup%2Fgithub%22%2C%22ipfs%22%3A%7B%22host%22%3A%22ipfs.kosmos.org%22%2C%22port%22%3A%225444%22%2C%22protocol%22%3A%22https%22%2C%22gatewayUrl%22%3A%22https%3A%2F%2Fipfs.kosmos.org%2Fipfs%22%7D%2C%22tokens%22%3A%7B%22BTC%22%3A%220x2260fac5e5542a773aa44fbcfedf7c193bc2c599%22%7D%2C%22communityFundsAPI%22%3A%7B%22balances%22%3A%7B%22onchain%22%3A%7B%22icon%22%3A%22icon-btc.png%22%2C%22symbol%22%3A%22BTC%22%2C%22description%22%3A%22BTC%20on%20chain%22%2C%22url%22%3A%22https%3A%2F%2Fapi.kosmos.org%2Fbtcpay%2Fonchain_btc_balance%22%7D%2C%22lightning%22%3A%7B%22icon%22%3A%22icon-btc-lightning.png%22%2C%22symbol%22%3A%22BTC%22%2C%22description%22%3A%22BTC%20on%20Lightning%20Network%22%2C%22url%22%3A%22https%3A%2F%2Fapi.kosmos.org%2Fbtcpay%2Flightning_btc_balance%22%7D%7D%7D%2C%22corsProxy%22%3A%22https%3A%2F%2Fcors.5apps.com%2F%3Furi%3D%22%2C%22exportApplicationGlobal%22%3Afalse%7D" />
|
||||||
|
|
||||||
<link integrity="" rel="stylesheet" href="/assets/vendor-ca96b2e19fc9f356e3dbad90c9f3f323.css">
|
<link integrity="" rel="stylesheet" href="/assets/vendor-ca96b2e19fc9f356e3dbad90c9f3f323.css">
|
||||||
<link integrity="" rel="stylesheet" href="/assets/kredits-web-1ce689f6aada92a7d79a1947300931cf.css">
|
<link integrity="" rel="stylesheet" href="/assets/kredits-web-950f3a97cf1dfead67fdfdc4f5dc1cfb.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<script src="/assets/vendor-4d87b3e0995c5bb18e46836a089900a4.js" integrity="sha256-5WmWY05Kd+n98Sw0GwuaWodmDVBZ2yVGGtC/2owVfQE= sha512-tiGPA5zvfhnSC9LPTmpvXJmOu30yhsdPqSiZJMPGmE/ez/xJLMaM29vjs4Cs74cDf6fX4uYSGRIu1KfOyGpJYA==" ></script>
|
<script src="/assets/vendor-4d87b3e0995c5bb18e46836a089900a4.js" integrity="sha256-5WmWY05Kd+n98Sw0GwuaWodmDVBZ2yVGGtC/2owVfQE= sha512-tiGPA5zvfhnSC9LPTmpvXJmOu30yhsdPqSiZJMPGmE/ez/xJLMaM29vjs4Cs74cDf6fX4uYSGRIu1KfOyGpJYA==" ></script>
|
||||||
<script src="/assets/kredits-web-71e8e218f4178df50b78058520257c0d.js" integrity="sha256-pQsThEeIoXS7h22Jg3XPg+5l268k7S63rhGhhHC10o8= sha512-CV9qAyQL3jdXW4+DmTdaGFtGYZ9Lz+f4+8aUnQyK+wOeDkLpUultyhhF2P1+wHS6Hm2vj7n213Ef89YblxDgUA==" ></script>
|
<script src="/assets/kredits-web-5b714ebc501e0789ddba130f2a3f10e1.js" integrity="sha256-jb10J7E1WRUc8DztQgvbdsKXYRHqXTqjbap4CVh2AaM= sha512-dx+d1T+WrZs0qG1J4puW0hZEzG2Qh+d5iU3XXnkfkF8ya3lMp/L1xdfzh697Ca5x3/Gw7+j7Mb/LSPUfWuNCEQ==" ></script>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -1,58 +1,13 @@
|
|||||||
import { module, test } from 'qunit';
|
import { module, test } from 'qunit';
|
||||||
import { setupRenderingTest } from 'ember-qunit';
|
import { setupRenderingTest } from 'ember-qunit';
|
||||||
import { click, fillIn, render } from '@ember/test-helpers';
|
import { render } from '@ember/test-helpers';
|
||||||
import { hbs } from 'ember-cli-htmlbars';
|
import { hbs } from 'ember-cli-htmlbars';
|
||||||
import contributors from '../../../fixtures/contributors';
|
|
||||||
|
|
||||||
module('Integration | Component | add-reimbursement', function(hooks) {
|
module('Integration | Component | add-reimbursement', function(hooks) {
|
||||||
setupRenderingTest(hooks);
|
setupRenderingTest(hooks);
|
||||||
|
|
||||||
hooks.beforeEach(function() {
|
test('it works', async function(assert) {
|
||||||
let kredits = this.owner.lookup('service:kredits');
|
|
||||||
kredits.set('contributors', contributors);
|
|
||||||
kredits.set('currentUser', contributors.findBy('id', 3));
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Contributor select menu', async function(assert) {
|
|
||||||
await render(hbs`<AddReimbursement />`);
|
await render(hbs`<AddReimbursement />`);
|
||||||
|
assert.ok(true);
|
||||||
assert.equal(this.element.querySelectorAll('select#contributor option').length, contributors.length,
|
|
||||||
'contains correct amount of items');
|
|
||||||
|
|
||||||
assert.equal(this.element.querySelector('select#contributor option:checked').value, "3",
|
|
||||||
'preselects the connected contributor account');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Adding expense items', async function(assert) {
|
|
||||||
await render(hbs`<AddReimbursement />`);
|
|
||||||
|
|
||||||
assert.dom(this.element).includesText('New expense item');
|
|
||||||
|
|
||||||
await fillIn('form input[name="expense-amount"]', '49');
|
|
||||||
await fillIn('form input[name="expense-title"]', 'Domain kosmos.org (yearly fee)');
|
|
||||||
await click('form#add-expense-item input[type="submit"]');
|
|
||||||
|
|
||||||
assert.equal(this.element.querySelector('input[name="total-eur"]').value, '49',
|
|
||||||
'updates the total EUR amount');
|
|
||||||
assert.equal(this.element.querySelector('input[name="total-usd"]').value, '0',
|
|
||||||
'does not update the total USD amount');
|
|
||||||
assert.equal(this.element.querySelector('input[name="total-btc"]').value, '0.00534493',
|
|
||||||
'updates the total BTC amount');
|
|
||||||
|
|
||||||
assert.dom(this.element).doesNotIncludeText('New expense item');
|
|
||||||
|
|
||||||
await click('button#add-another-item');
|
|
||||||
|
|
||||||
await fillIn('form input[name="expense-amount"]', '29');
|
|
||||||
await fillIn('select[name="expense-currency"]', 'USD');
|
|
||||||
await fillIn('form input[name="expense-title"]', 'Domain kosmos.social (yearly fee)');
|
|
||||||
await click('form#add-expense-item input[type="submit"]');
|
|
||||||
|
|
||||||
assert.equal(this.element.querySelector('input[name="total-usd"]').value, '29',
|
|
||||||
'updates the total USD amount');
|
|
||||||
assert.equal(this.element.querySelector('input[name="total-eur"]').value, '49',
|
|
||||||
'does not update the total EUR amount');
|
|
||||||
assert.equal(this.element.querySelector('input[name="total-btc"]').value, '0.00804268',
|
|
||||||
'updates the total BTC amount');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user