Add quick filters

This commit is contained in:
2019-07-06 15:49:29 +02:00
parent 0e0b1afe3a
commit abb7d95804
5 changed files with 126 additions and 33 deletions
+38 -2
View File
@@ -1,9 +1,45 @@
import Component from '@ember/component';
import { computed } from '@ember/object';
import { sort } from '@ember/object/computed';
import { isPresent } from '@ember/utils';
import { inject as service } from '@ember/service';
export default Component.extend({
tagName: 'ul',
classNames: ['contribution-list'],
tagName: 'div',
classNames: ['contributions'],
kredits: service(),
contributorsSorting: Object.freeze(['name:asc']),
contributors: sort('kredits.contributors', 'contributorsSorting'),
contributorsActive: computed('contributors.[]', 'contributions', function() {
let activeIds = this.contributions.mapBy('contributorId')
.map(id => id.toString())
.uniq();
return this.contributors.filter(c => {
return activeIds.includes(c.id.toString());
});
}),
showQuickFilter: false,
hideSmallContributions: false,
contributorId: null,
contributionsFiltered: computed('contributions.[]', 'hideSmallContributions', 'contributorId', function() {
return this.contributions.filter(c => {
let included = true;
if (this.hideSmallContributions &&
c.amount <= 500) { included = false; }
if (isPresent(this.contributorId) &&
(c.contributorId.toString() !== this.contributorId.toString())) { included = false; }
return included;
});
}),
actions: {
+25 -2
View File
@@ -1,4 +1,26 @@
{{#each contributions as |contribution|}}
{{#if showQuickFilter}}
<div class="quick-filter">
<p>
<label class="filter-contributor">
Contributor:
<select onchange={{action (mut contributorId) value="target.value"}}>
<option value="" selected>all</option>
{{#each contributorsActive as |contributor|}}
<option value={{contributor.id}} selected={{eq contributorId contributor.id}}>{{contributor.name}}</option>
{{/each}}
</select>
</label>
<label class="filter-contribution-size">
{{input type="checkbox" checked=hideSmallContributions}}
Hide small contributions
</label>
</p>
</div>
{{/if}}
<ul class="contribution-list">
{{#each contributionsFiltered as |contribution|}}
<li data-contribution-id={{contribution.id}} class="{{contribution-status contribution}} {{if contribution.vetoed "vetoed"}}">
<p class="meta">
<span class="recipient">{{user-avatar contributor=contribution.contributor}}</span>
@@ -22,4 +44,5 @@
{{/unless}}
{{/unless}}
</li>
{{/each}}
{{/each}}
</ul>
@@ -6,6 +6,24 @@ main section {
}
}
.quick-filter {
font-size: 1.2rem;
margin-bottom: 2rem;
p {
font-size: inherit;
padding: 0.2rem 0 0;
}
label {
font-size: inherit;
&+ label {
margin-left: 3.6rem;
}
}
}
ul.contribution-list {
clear: both;
width: 100%;
+4 -2
View File
@@ -51,7 +51,8 @@
{{!-- TODO: We need a better naming for kredits.hasAccounts --}}
{{contribution-list contributions=contributionsUnconfirmedSorted
vetoContribution=(action "vetoContribution")
contractInteractionEnabled=kredits.hasAccounts}}
contractInteractionEnabled=kredits.hasAccounts
showQuickFilter=showQuickFilterUnconfirmed}}
</div>
</section>
{{/if}}
@@ -65,7 +66,8 @@
</header>
<div class="content">
{{contribution-list contributions=contributionsConfirmedSorted
vetoContribution=(action "vetoContribution")}}
vetoContribution=(action "vetoContribution")
showQuickFilter=showQuickFilterConfirmed}}
</div>
</section>
</div>
@@ -1,17 +1,31 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render } from '@ember/test-helpers';
import { click, fillIn, render } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import contributors from '../../../fixtures/contributors';
import contributions from '../../../fixtures/contributions';
module('Integration | Component | contribution-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) { ... });
test('it renders all contributions', async function(assert) {
this.set('fixtures', contributions);
await render(hbs`{{contribution-list contributions=fixtures}}`);
await render(hbs`{{contribution-list}}`);
assert.equal(this.element.querySelectorAll('li').length, 9);
});
assert.equal(this.element.textContent.trim(), '');
test('it renders filtered contributions', async function(assert) {
let service = this.owner.lookup('service:kredits');
service.set('contributors', contributors);
this.set('fixtures', contributions);
await render(hbs`{{contribution-list contributions=fixtures showQuickFilter=true}}`);
await fillIn('.filter-contributor select', '1');
assert.equal(this.element.querySelectorAll('li').length, 5, 'select contributor');
await click('.filter-contribution-size input');
assert.equal(this.element.querySelectorAll('li').length, 4, 'hide small contributions');
});
});