Compare commits

...

18 Commits

Author SHA1 Message Date
basti a2bd3f76b8 1.7.0 2019-08-12 14:55:54 +02:00
basti a4ca37d882 Merge pull request #146 from 67P/feauture/141-time_picker
Add time input to contribution form
2019-08-12 14:52:07 +02:00
basti 143317d909 Merge pull request #147 from 67P/docs/readme
Fix npm run start:local instructions
2019-08-04 19:43:06 +02:00
fsmanuel d8bcc8ff67 Fix npm run start:local instructions 2019-08-04 19:36:09 +02:00
basti e4a39ec67c Fix bug with default date input
When the input isn't touched by the user, the date isn't stored as an
array on the property.
2019-08-02 16:58:12 +02:00
basti 5b47ba9e11 Import missing module 2019-08-02 16:58:01 +02:00
basti d8f565cd9e Use start of current hour as default contribution time
Co-Authored-By: Garret Alfert <alfert@wevelop.de>
2019-08-02 16:08:13 +02:00
basti a9480a09f1 Add time input to conribution form
After adding it as a separate field, I figured out that we should use
the same picker, because otherwise we'd have to keep the date in sync
depending on the time zone. Zones are too messy in that regard, and the
date is already normalized to UTC before creating the contribution
record.

closes #141
2019-07-31 13:20:39 +02:00
basti aa9c3648c0 1.6.0 2019-07-17 17:41:49 +02:00
galfert 9c18593529 Merge pull request #140 from 67P/feature/contribution_details
Contribution details
2019-07-17 17:23:14 +02:00
basti 52fe7ff026 Remove commented CSS 2019-07-17 16:55:04 +02:00
basti b02967c5ef Basic contribution details
Adds a details pane for contribution records, similar to contributor
profiles.

Just the basic details for now. Can be extended with all kinds of
data, links, icons, etc. from here on.
2019-07-17 12:58:16 +02:00
basti 7236b2d2b3 Add basics for contribution details
Route, controller, links, selected property/styles, etc.
2019-07-16 15:35:35 +02:00
basti fd1ae0a612 Merge pull request #139 from 67P/feature/update_ember
Update dependencies
2019-07-15 20:07:02 +02:00
galfert 612b76300c Remove ember-cli-update dependency
All but one of the ~80 vulnerabilities reported by `npm audit` were from dependencies of `ember-cli-update`.
2019-07-15 19:17:56 +02:00
galfert 42fe01b349 Run codemods 2019-07-15 19:17:56 +02:00
galfert 80af572742 Run ember-cli-update --to 3.10.1 2019-07-15 19:17:56 +02:00
galfert d7a0817ac6 Update ember-cli-update 2019-07-15 19:17:56 +02:00
35 changed files with 4626 additions and 7660 deletions
+10 -2
View File
@@ -1,7 +1,7 @@
module.exports = {
root: true,
parserOptions: {
ecmaVersion: 2017,
ecmaVersion: 2018,
sourceType: 'module'
},
globals: {
@@ -41,7 +41,15 @@ module.exports = {
env: {
browser: false,
node: true
}
},
plugins: ['node'],
rules: Object.assign({}, require('eslint-plugin-node').configs.recommended.rules, {
// add your custom rules and overrides for node files here
// this can be removed once the following is fixed
// https://github.com/mysticatea/eslint-plugin-node/issues/77
'node/no-unpublished-require': 'off'
})
}
]
};
+2 -1
View File
@@ -4,6 +4,7 @@ module.exports = {
extends: 'recommended',
rules: {
'simple-unless': false
'simple-unless': false,
'no-nested-interactive': false
}
};
-3
View File
@@ -23,9 +23,6 @@ env:
# See https://git.io/vdao3 for details.
- JOBS=1
before_install:
- npm config set spin false
script:
- npm run lint:hbs
- npm run lint:js
+2 -1
View File
@@ -97,7 +97,8 @@ With IPFS and Ethereum/ganache running, you can now start this Ember app.
If you restart the devchain your network ID changes. So kredits-contracts does not find the correct DAO Kernel address.
If that is the case the DAO address must be provided as `KREDITS_KERNEL_ADDRESS` environment variable.
* `KREDITS_KERNEL_ADDRESS=<0xYOURADDRESS> npm run start:local` - find your address with the `npm run dao:address` command in the kredits-contracts repo.
* `npm run dao:address` in the kredits-contracts repo to find your address
* `KREDITS_KERNEL_ADDRESS=<0xYOURADDRESS> npm run start:local`
#### IPFS
+9 -4
View File
@@ -1,6 +1,7 @@
import Component from '@ember/component';
import { computed } from '@ember/object';
import { and, notEmpty } from '@ember/object/computed';
import moment from 'moment';
export default Component.extend({
@@ -21,13 +22,13 @@ export default Component.extend({
init () {
this._super(...arguments);
this.set('defaultDate', new Date());
this.set('defaultDate', moment().startOf('hour').toDate());
// Default attributes used by reset
this.set('attributes', {
contributorId: null,
kind: null,
date: [new Date()],
date: this.defaultDate,
amount: null,
description: null,
url: null,
@@ -49,8 +50,12 @@ export default Component.extend({
}
const attributes = this.getProperties(Object.keys(this.attributes));
const [ date/* , time */ ] = attributes.date[0].toISOString().split('T');
attributes.date = date;
let dateInput = (attributes.date instanceof Array) ?
attributes.date[0] : attributes.date;
const [ date, time ] = dateInput.toISOString().split('T');
[ attributes.date, attributes.time ] = [ date, time ];
this.set('inProgress', true);
+23 -9
View File
@@ -1,15 +1,20 @@
<form {{action "submit" on="submit"}}>
<label>
<p class="label">Contributor:</p>
<p>
<select required onchange={{action (mut contributorId) value="target.value"}}>
<option value="" selected disabled hidden>Contributor</option>
<option value="" selected disabled hidden></option>
{{#each contributors as |contributor|}}
<option value={{contributor.id}} selected={{eq contributorId contributor.id}}>{{contributor.name}}</option>
{{/each}}
</select>
</p>
</label>
<label>
<p class="label">Kind:</p>
<p>
<select required onchange={{action (mut kind) value="target.value"}}>
<option value="" selected disabled hidden>Kind</option>
<option value="" selected disabled hidden></option>
<option value="community" selected={{eq kind "community"}}>Community</option>
<option value="design" selected={{eq kind "design"}}>Design</option>
<option value="dev" selected={{eq kind "dev"}}>Development</option>
@@ -18,37 +23,46 @@
<option value="special" selected={{eq kind "special"}}>Special</option>
</select>
</p>
</label>
<label>
<p class="label">Date:</p>
<p>
{{ember-flatpickr
allowInput=false
altFormat="F j, Y"
altInput=true
altInputClass="date-alt"
date=date
dateFormat="Y-m-d"
defaultDate=defaultDate
maxDate=defaultDate
enableTime=true
time_24hr=true
onChange=(action (mut date))
}}
</p>
</label>
<label>
<p class="label">Amount:</p>
<p>
{{input type="text"
placeholder="500"
value=amount
class=(if isValidAmount "valid" "")}}
</p>
</label>
<label>
<p class="label">Description:</p>
<p>
{{input type="text"
placeholder="Description"
value=description
class=(if isValidDescription "valid" "")}}
</p>
</label>
<label>
<p class="label">URL (optional):</p>
<p>
{{input type="text"
placeholder="URL (optional)"
value=url
class=(if isValidUrl "valid" "")}}
</p>
</label>
<p class="actions">
{{input type="submit"
disabled=inProgress
@@ -6,9 +6,13 @@ import { inject as service } from '@ember/service';
export default Component.extend({
router: service(),
tagName: 'div',
classNames: ['contributions'],
selectedContribution: null,
showQuickFilter: false,
hideSmallContributions: false,
contributorId: null,
@@ -57,6 +61,10 @@ export default Component.extend({
} else {
window.alert('Only members can veto contributions. Please ask someone to set you up.');
}
},
openContributionDetails(contribution) {
this.router.transitionTo('dashboard.contributions.show', contribution);
}
}
@@ -31,17 +31,13 @@
<ul class="contribution-list">
{{#each contributionsFiltered as |contribution|}}
<li data-contribution-id={{contribution.id}} class="{{contribution-status contribution}} {{if contribution.vetoed "vetoed"}}">
<li role="button" {{action "openContributionDetails" contribution}}
data-contribution-id={{contribution.id}}
class="{{contribution-status contribution}}{{if contribution.vetoed " vetoed"}}{{if (eq contribution.id selectedContributionId) " selected"}}">
<p class="meta">
<span class="recipient">{{user-avatar contributor=contribution.contributor}}</span>
<span class="category {{contribution.kind}}">({{contribution.kind}})</span>
<span class="title">
{{#if contribution.url}}
<a href={{contribution.url}} target="_blank" rel="noopener" title={{contribution.description}}>{{contribution.description}}</a>
{{else}}
{{contribution.description}}
{{/if}}
</span>
<span class="title">{{contribution.description}}</span>
</p>
<p class="kredits-amount">
<span class="amount">{{contribution.amount}}</span><span class="symbol">₭S</span>
@@ -7,6 +7,7 @@ export default Component.extend({
tagName: 'table',
classNames: 'contributor-list',
selectedContributorId: null,
actions: {
+2 -3
View File
@@ -1,8 +1,7 @@
<tbody>
{{#each contributorList as |c|}}
<tr role="button"
class="{{if (is-current-user c.contributor) "current-user"}} {{if (eq c.contributor.id selectedContributorId) "selected"}}"
{{action "openContributorDetails" c.contributor}}>
<tr role="button" {{action "openContributorDetails" c.contributor}}
class="{{if (is-current-user c.contributor) "current-user"}} {{if (eq c.contributor.id selectedContributorId) "selected"}}">
<td class="person">
{{user-avatar contributor=c.contributor}} {{c.contributor.name}}
</td>
+1
View File
@@ -8,6 +8,7 @@ export default Controller.extend({
showDetailsPane: false,
selectedContributorId: null,
selectedContributionId: null,
currentBlock: alias('kredits.currentBlock'),
+8 -2
View File
@@ -1,4 +1,4 @@
import EmberObject from '@ember/object';
import EmberObject, { computed } from '@ember/object';
import bignumber from 'kredits-web/utils/cps/bignumber';
export default EmberObject.extend({
@@ -18,11 +18,17 @@ export default EmberObject.extend({
description: null,
details: null,
url: null,
date: null,
time: null,
ipfsData: '',
init () {
this._super(...arguments);
this.set('details', {});
}
},
iso8601Date: computed('date', 'time', function() {
return this.time ? `${this.date}T${this.time}` : this.date;
})
});
+4
View File
@@ -11,6 +11,10 @@ Router.map(function() {
this.route('contributors', function() {
this.route('show', { path: ':id' });
});
this.route('contributions', function() {
this.route('show', { path: ':id' });
});
});
this.route('proposals', function() {
this.route('new');
@@ -0,0 +1,32 @@
import { inject as service } from '@ember/service';
import Route from '@ember/routing/route';
import { alias } from '@ember/object/computed';
export default Route.extend({
kredits: service(),
contributions: alias('kredits.contributions'),
model (params) {
return this.contributions.findBy('id', parseInt(params.id));
},
setupController (controller, model) {
this._super(controller, model);
this.controllerFor('dashboard')
.setProperties({
showDetailsPane: true,
selectedContributionId: model.id
});
},
deactivate () {
this.controllerFor('dashboard')
.setProperties({
showDetailsPane: false,
selectedContributionId: null
});
}
});
+4
View File
@@ -7,6 +7,10 @@ section#add-proposal {
p {
margin-bottom: 1.5rem;
&.label {
margin-bottom: .5rem;
}
&.actions {
padding-top: 1.5rem;
text-align: center;
+1
View File
@@ -99,6 +99,7 @@ section {
@import "forms";
@import "components/contribution-list";
@import "components/contribution-details";
@import "components/contributor-list";
@import "components/contributor-profile";
@import "components/external-account-link";
@@ -0,0 +1,59 @@
section#contribution-details {
header {
nav {
.amount {
font-size: 1.5rem;
}
.symbol {
padding-left: 0.2rem;
}
}
}
.content {
width: 100%;
margin: 0 0 1.5rem;
padding: 2rem 2rem;
border-top: 1px solid rgba(255,255,255,0.2);
border-bottom: 1px solid rgba(255,255,255,0.2);
background-color: rgba(255,255,255,0.1);
h3 {
font-size: 1.5rem;
margin-bottom: 2rem;
}
p {
margin-bottom: 2rem;
span {
font-size: inherit;
}
&.who-what-when {
font-size: 1.2rem;
margin-bottom: 1.2rem;
}
&:last-of-type {
margin-bottom: 0;
}
}
a {
color: $primary-color;
text-decoration: none;
font-size: inherit;
&:hover {
text-decoration: underline;
}
}
}
.actions {
text-align: center;
}
}
@@ -37,6 +37,7 @@ ul.contribution-list {
background-color: rgba(255,255,255,0.1);
font-size: 1.2rem;
border-bottom: 1px solid rgba(255,255,255,0.2);
cursor: pointer;
&:first-of-type {
border-top: 1px solid rgba(255,255,255,0.2);
@@ -52,6 +53,10 @@ ul.contribution-list {
opacity: 0.6;
}
&.selected {
background-color: rgba(255,255,255,0.2);
}
p {
align-self: center;
margin: 0;
+2
View File
@@ -53,6 +53,7 @@
{{contribution-list contributions=contributionsUnconfirmedSorted
vetoContribution=(action "vetoContribution")
contractInteractionEnabled=kredits.hasAccounts
selectedContributionId=selectedContributionId
showQuickFilter=showQuickFilterUnconfirmed}}
</div>
</section>
@@ -68,6 +69,7 @@
<div class="content">
{{contribution-list contributions=contributionsConfirmedSorted
vetoContribution=(action "vetoContribution")
selectedContributionId=selectedContributionId
showQuickFilter=showQuickFilterConfirmed}}
</div>
</section>
@@ -0,0 +1,47 @@
<section id="contribution-details">
<header class="with-nav">
<h2>Contribution #{{model.id}}</h2>
<nav>
<span class="amount">{{model.amount}}</span>&nbsp;
<span class="symbol">₭S</span>
</nav>
</header>
<div class="content">
<p class="who-what-when">
<span class="contributor">
{{user-avatar contributor=model.contributor}}
{{link-to model.contributor.name "dashboard.contributors.show" model.contributor}}
</span>
contributed
<span class="date" title={{model.iso8601Date}}>{{moment-from model.iso8601Date}}</span>:
</p>
<h3>{{model.description}}</h3>
<p>
Kind: {{model.kind}}
<br>Status: {{contribution-status model}}
</p>
{{#if model.url}}
<p>
<a href={{model.url}}
title={{model.description}}
class="button"
target="_blank"
rel="noopener">
Open URL
</a>
</p>
{{/if}}
</div>
<div class="actions">
<p>
{{#if model.ipfsHash}}
<a href="https://ipfs.io/ipfs/{{model.ipfsHash}}"
class="button small" target="_blank" rel="noopener">
Inspect IPFS data
</a>
{{/if}}
</p>
</div>
</section>
+1 -1
View File
@@ -12,7 +12,7 @@ module.exports = function(environment) {
EmberENV: {
FEATURES: {
// Here you can enable experimental features on an ember canary build
// e.g. 'with-controller': true
// e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true
},
EXTEND_PROTOTYPES: {
// Prevent Ember Data from overriding Date.parse.
+1291 -5173
View File
File diff suppressed because it is too large Load Diff
+18 -16
View File
@@ -1,6 +1,6 @@
{
"name": "kredits-web",
"version": "1.5.1",
"version": "1.7.0",
"private": true,
"description": "Contribution dashboard of the Kosmos project",
"repository": "https://github.com/67P/kredits-web",
@@ -24,46 +24,48 @@
"deploy": "git push 5apps master"
},
"devDependencies": {
"@ember/jquery": "^0.5.2",
"@ember/optional-features": "^0.6.3",
"@ember/jquery": "^0.6.0",
"@ember/optional-features": "^0.7.0",
"babel-preset-es2015": "^6.22.0",
"babelify": "^7.3.0",
"brfs": "^2.0.2",
"broccoli-asset-rev": "^2.7.0",
"ember-ajax": "^4.0.1",
"broccoli-asset-rev": "^3.0.0",
"ember-ajax": "^5.0.0",
"ember-auto-import": "^1.5.2",
"ember-awesome-macros": "0.41.0",
"ember-cli": "~3.8.1",
"ember-cli": "~3.10.1",
"ember-cli-app-version": "^3.2.0",
"ember-cli-babel": "^7.1.2",
"ember-cli-babel": "^7.7.3",
"ember-cli-chart": "^3.4.0",
"ember-cli-dependency-checker": "^3.1.0",
"ember-cli-eslint": "^4.2.3",
"ember-cli-htmlbars": "^3.0.0",
"ember-cli-htmlbars-inline-precompile": "^1.0.3",
"ember-cli-eslint": "^5.1.0",
"ember-cli-htmlbars": "^3.0.1",
"ember-cli-htmlbars-inline-precompile": "^2.1.0",
"ember-cli-inject-live-reload": "^1.8.2",
"ember-cli-moment-shim": "^3.7.1",
"ember-cli-sass": "^7.2.0",
"ember-cli-sri": "^2.1.1",
"ember-cli-template-lint": "^1.0.0-beta.1",
"ember-cli-uglify": "^2.1.0",
"ember-cli-update": "^0.21.2",
"ember-export-application-global": "^2.0.0",
"ember-flatpickr": "^2.14.0",
"ember-load-initializers": "^1.1.0",
"ember-load-initializers": "^2.0.0",
"ember-macro-helpers": "0.17.0",
"ember-maybe-import-regenerator": "^0.1.6",
"ember-moment": "^7.8.1",
"ember-promise-helpers": "1.0.6",
"ember-qunit": "^3.4.1",
"ember-qunit": "^4.4.1",
"ember-resolver": "^5.0.1",
"ember-source": "~3.8.0",
"ember-source": "~3.10.0",
"ember-truth-helpers": "github:jmurphyau/ember-truth-helpers#31a14373a31f1f82c77537720549b47a95c28e5f",
"eslint-plugin-ember": "^5.2.0",
"eslint-plugin-ember": "^6.2.0",
"eslint-plugin-node": "^9.0.1",
"ethers": "^4.0.27",
"kosmos-schemas": "^2.0.0",
"kredits-contracts": "^5.4.0",
"loader.js": "^4.7.0",
"ndjson": "github:hugomrdias/ndjson#feat/readable-stream3",
"qunit-dom": "^0.8.0",
"qunit-dom": "^0.8.4",
"transform-loader": "^0.2.4",
"tv4": "^1.3.0"
},
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
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
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -8,10 +8,10 @@
<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%7D%2C%22APP%22%3A%7B%22name%22%3A%22kredits-web%22%2C%22version%22%3A%221.5.1%2Bc6588097%22%7D%2C%22browserify%22%3A%7B%22tests%22%3Atrue%2C%22transform%22%3A%5B%5B%22babelify%22%2C%7B%22presets%22%3A%5B%22es2015%22%5D%2C%22global%22%3Atrue%7D%5D%5D%7D%2C%22web3ProviderUrl%22%3A%22https%3A%2F%2Frinkeby.infura.io%2Fv3%2Fd4f788b7a6584f7db2fc3c268d4d09e9%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%22kreditsApmDomain%22%3A%22open.aragonpm.eth%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_JQUERY_INTEGRATION%22%3Atrue%7D%2C%22APP%22%3A%7B%22name%22%3A%22kredits-web%22%2C%22version%22%3A%221.7.0%2Ba4ca37d8%22%7D%2C%22browserify%22%3A%7B%22tests%22%3Atrue%2C%22transform%22%3A%5B%5B%22babelify%22%2C%7B%22presets%22%3A%5B%22es2015%22%5D%2C%22global%22%3Atrue%7D%5D%5D%7D%2C%22web3ProviderUrl%22%3A%22https%3A%2F%2Frinkeby.infura.io%2Fv3%2Fd4f788b7a6584f7db2fc3c268d4d09e9%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%22kreditsApmDomain%22%3A%22open.aragonpm.eth%22%2C%22exportApplicationGlobal%22%3Afalse%7D" />
<link integrity="" rel="stylesheet" href="/assets/vendor-179cf27a97ea5bbb0ce72403a401cc8c.css">
<link integrity="" rel="stylesheet" href="/assets/kredits-web-d27bdcdf554d9b3bd6b4d37dd84f4db2.css">
<link integrity="" rel="stylesheet" href="/assets/kredits-web-e95be4cbe614c5aa4c7a891c6eedb028.css">
@@ -24,8 +24,8 @@
<body>
<script src="/assets/vendor-13953d1578bf9c8e1d4dec9854bc4804.js" integrity="sha256-F5T7/NqJV3S3xep1UpKy/oQii+9YrqCry6EiZxhkzOA= sha512-y4Kk91N4T4PdPgjLiBRJV7q8XFmQY9Dh5ygJayeRcMRBueWJCe4OPDnrstcJ8C/cjGePUGOFoTmMSbF0wWTB+w==" ></script>
<script src="/assets/kredits-web-686d8b7af100292e31164c098c81d9fe.js" integrity="sha256-HjLTIO3FCh5VYjuLTlJEx4Ek3OX9fcpEpnNTVYjmiXs= sha512-NQqT/Mx6eFztNGI+lmRPYo/cfDSGKHLtttfzh69EV6daCMLtJUW1NfI4xNpErMadPudRMOAG3R5Uis7+qLoJjw==" ></script>
<script src="/assets/vendor-d84a577c9f0624a0b15861936fe740f2.js" integrity="sha256-o5SitqUpXKccldebvatDY/WvXTbEnAu/IA/TyvBxU0U= sha512-gDMabciAMuF89anreuu39lAYDOf6tXMMHxVRUxtqGpmhJdSAUQGFQ2MWTgE8mt+8GvGvPxw9QvnHuBJDK34YVw==" ></script>
<script src="/assets/kredits-web-abcf1575c8eb056a923a583efdc2d00f.js" integrity="sha256-IEH1g/CviSkQ/8acQOgUqB1iPBlXgsJlGJqsAzs9iqg= sha512-znuWeezXPnfkekpebFEC/4uVT0DjHS52ORURS11H7+kCtgyMjLqvSS8it/GzLxSsameIUaoMsvctqhL8f+atMg==" ></script>
</body>
@@ -11,7 +11,7 @@ module('Integration | Component | user-avatar', function(hooks) {
this.set('bumi', contributors.findBy('id', '1'));
await render(hbs`{{user-avatar contributor=bumi}}`);
assert.equal(this.element.textContent.trim(), '');
assert.dom(this.element).hasText('');
});
test('default image source URL', async function(assert) {
@@ -0,0 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Route | dashboard/contributions/show', function(hooks) {
setupTest(hooks);
test('it exists', function(assert) {
let route = this.owner.lookup('route:dashboard/contributions/show');
assert.ok(route);
});
});
+13 -13
View File
@@ -5,16 +5,15 @@ import { A } from '@ember/array';
import { module, test } from 'qunit';
import groupBy from 'kredits-web/utils/group-by';
module('Unit | Utils | group-by');
module('Unit | Utils | group-by', function () {
let car1 = { name: 'Carrera', color: 'red' };
let car2 = { name: 'Veyron', color: 'red' };
let car3 = { name: 'Corvette', color: 'blue' };
let car4 = { name: 'Viper', color: 'blue' };
let car5 = { name: 'Cobra', color: 'green' };
let cars = A([car1, car2, car3, car4, car5]);
let car1 = { name: 'Carrera', color: 'red' };
let car2 = { name: 'Veyron', color: 'red' };
let car3 = { name: 'Corvette', color: 'blue' };
let car4 = { name: 'Viper', color: 'blue' };
let car5 = { name: 'Cobra', color: 'green' };
let cars = A([car1, car2, car3, car4, car5]);
test('it groups cars by color', function(assert) {
test('it groups cars by color', function (assert) {
assert.expect(1);
let redGroup = { property: 'color', value: 'red', items: [car1, car2] };
let blueGroup = { property: 'color', value: 'blue', items: [car3, car4] };
@@ -24,18 +23,19 @@ test('it groups cars by color', function(assert) {
let expected = [redGroup, blueGroup, greenGroup];
assert.deepEqual(result, expected);
});
});
test('it does not fail with empty array', function(assert) {
test('it does not fail with empty array', function (assert) {
let cars = [];
let result = groupBy(cars, 'color');
assert.deepEqual(result, []);
});
});
test('it does not failkwith null', function(assert) {
test('it does not failkwith null', function (assert) {
let cars = null;
let result = groupBy(cars, 'color');
assert.deepEqual(result, []);
});
});