Skip to content

Commit 8a2130d

Browse files
joshsmithbegedin
authored andcommitted
Add status filtering to GitHub events (#1669)
* Add status filtering to github events
1 parent 970526e commit 8a2130d

File tree

9 files changed

+247
-12
lines changed

9 files changed

+247
-12
lines changed
Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,101 @@
11
import Controller from '@ember/controller';
2+
import { computed, get, set } from '@ember/object';
23

34
export default Controller.extend({
4-
queryParams: ['page', 'size'],
5+
queryParams: ['eventAction', 'page', 'size', 'status', 'type'],
6+
7+
eventAction: '',
58
page: 1,
6-
size: 20
9+
size: 20,
10+
status: '',
11+
type: '',
12+
13+
statuses: [
14+
'errored',
15+
'processing',
16+
'processed',
17+
'reprocessing',
18+
'unprocessed',
19+
'unsupported'
20+
],
21+
22+
types: [
23+
'installation',
24+
'installation_repositories',
25+
'issue_comment',
26+
'issues',
27+
'pull_request'
28+
],
29+
30+
actionOptions: {
31+
'installation': [
32+
'created',
33+
'deleted'
34+
],
35+
'installation_repositories': [
36+
'added',
37+
'removed'
38+
],
39+
'issue_comment': [
40+
'created',
41+
'deleted',
42+
'edited'
43+
],
44+
'issues': [
45+
'assigned',
46+
'closed',
47+
'demilestoned',
48+
'edited',
49+
'labeled',
50+
'milestoned',
51+
'opened',
52+
'reopened',
53+
'unassigned',
54+
'unlabeled'
55+
],
56+
'pull_request': [
57+
'assigned',
58+
'closed',
59+
'edited',
60+
'labeled',
61+
'opened',
62+
'reopened',
63+
'review_requested',
64+
'review_request_removed',
65+
'synchronize',
66+
'unassigned',
67+
'unlabeled'
68+
]
69+
},
70+
71+
selectableActions: computed('type', function() {
72+
let type = get(this, 'type');
73+
74+
if (type) {
75+
return get(this, 'actionOptions')[type];
76+
} else {
77+
return [];
78+
}
79+
}),
80+
81+
actions: {
82+
changeAction(action) {
83+
set(this, 'eventAction', action);
84+
},
85+
86+
changeStatus(status) {
87+
set(this, 'status', status);
88+
},
89+
90+
changeType(type) {
91+
set(this, 'eventAction', null);
92+
set(this, 'type', type);
93+
},
94+
95+
clearFilters() {
96+
set(this, 'eventAction', null);
97+
set(this, 'status', null);
98+
set(this, 'type', null);
99+
}
100+
}
7101
});

app/routes/admin/github-events/index.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,43 @@ import Route from '@ember/routing/route';
22

33
export default Route.extend({
44
model(params) {
5-
return this.store.query('github-event', {
5+
let queryParams = {
66
page: {
77
page: params.page,
88
'page-size': params.size
99
}
10-
});
10+
};
11+
12+
if (params.eventAction) {
13+
queryParams.action = params.eventAction;
14+
}
15+
16+
if (params.status) {
17+
queryParams.status = params.status;
18+
}
19+
20+
if (params.type) {
21+
queryParams.type = params.type;
22+
}
23+
24+
return this.store.query('github-event', queryParams);
1125
},
1226

1327
queryParams: {
28+
eventAction: {
29+
refreshModel: true
30+
},
1431
page: {
1532
refreshModel: true
1633
},
1734
size: {
1835
refreshModel: true
36+
},
37+
status: {
38+
refreshModel: true
39+
},
40+
type: {
41+
refreshModel: true
1942
}
2043
}
2144
});

app/styles/_buttons.scss

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,8 @@
160160
}
161161

162162
.fa {
163-
&:first-child {
164-
padding-right: 5px;
165-
}
166163
&:last-child {
167-
padding-left: 5px;
164+
padding-right: 5px;
168165
}
169166
}
170167

app/styles/layout/_forms.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ select {
364364
border: 1px solid $gray;
365365
font-family: $body-font-family;
366366
font-size: $body-font-size-normal;
367-
height: 41px;
367+
height: 38px;
368368
padding: 0 16px;
369369
cursor: pointer;
370370
}

app/styles/templates/admin/admin.scss

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
}
3939
}
4040

41+
.log-actions {
42+
margin: 0.7em 0;
43+
}
44+
4145
.log-rows {
4246
display: table;
4347
width: 100%;
@@ -77,6 +81,10 @@ code.errored {
7781
border-bottom: 1px solid $border-gray;
7882
}
7983
}
84+
85+
&__empty {
86+
text-align: center;
87+
}
8088
}
8189

8290
.log-cell {

app/templates/admin/github-events/index.hbs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,34 @@
1+
<div class="log-actions">
2+
<span>{{fa-icon "filter"}}</span>
3+
4+
{{#x-select data-test-filter-status value=status action=(action "changeStatus") as |xs|}}
5+
<option value=''>Status</option>
6+
{{#each statuses as |status|}}
7+
{{#xs.option value=status}}{{status}}{{/xs.option}}
8+
{{/each}}
9+
{{/x-select}}
10+
11+
{{#x-select data-test-filter-type value=type action=(action "changeType") as |xs|}}
12+
<option value=''>Event Type</option>
13+
{{#each types as |type|}}
14+
{{#xs.option value=type}}{{type}}{{/xs.option}}
15+
{{/each}}
16+
{{/x-select}}
17+
18+
{{#if type}}
19+
{{#x-select data-test-filter-action value=eventAction action=(action "changeAction") as |xs|}}
20+
<option value=''>Action</option>
21+
{{#each selectableActions as |eventAction|}}
22+
{{#xs.option value=eventAction}}{{eventAction}}{{/xs.option}}
23+
{{/each}}
24+
{{/x-select}}
25+
{{/if}}
26+
27+
{{#if (or status type)}}
28+
<a data-test-clear-filters {{action "clearFilters"}} class="button clear">{{fa-icon "remove"}} Clear</a>
29+
{{/if}}
30+
</div>
31+
132
<div class="log-rows">
233
<div data-test-log-row-header class="log-row log-row--header">
334
<span class="log-cell log-cell--shrink">Status</span>

mirage/config.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,23 @@ export default function() {
174174
*/
175175

176176
this.get('/github-events', function(schema, request) {
177-
let items = schema.githubEvents.all();
178-
return paginate(items, '/github-events', request.queryParams);
177+
let events = schema.githubEvents.all();
178+
179+
let { action, status, type } = request.queryParams;
180+
181+
if (action) {
182+
events = events.filter((e) => e.action === action);
183+
}
184+
185+
if (status) {
186+
events = events.filter((e) => e.status === status);
187+
}
188+
189+
if (type) {
190+
events = events.filter((e) => e.eventType === type);
191+
}
192+
193+
return paginate(events, '/github-events', request.queryParams);
179194
});
180195
this.get('/github-events/:id');
181196
this.patch('/github-events/:id', function(schema) {

tests/acceptance/admin-github-events-test.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,51 @@ test('Displays all the logged events', function(assert) {
6666
assert.notOk(page.next.isDisabled, 'Next button is not disabled.');
6767
});
6868
});
69+
70+
test('Filters the logged events', function(assert) {
71+
assert.expect(17);
72+
73+
let user = server.create('user', { admin: true, id: 1 });
74+
server.create('github-event');
75+
let expectedEvent = server.create('github-event', { action: 'opened', status: 'errored', eventType: 'issues' });
76+
77+
authenticateSession(this.application, { user_id: user.id });
78+
79+
page.visit();
80+
81+
andThen(() => {
82+
assert.equal(page.logItems().count, 2, 'There are 2 log rows by default.');
83+
page.filterStatus.fillIn('errored');
84+
assert.notOk(page.filterAction.isVisible, 'Action filter is not visible.');
85+
});
86+
87+
andThen(() => {
88+
assert.equal(page.logItems().count, 1, 'There are 1 log rows after filtering.');
89+
assert.equal(page.logItems(0).action.text, expectedEvent.action);
90+
assert.equal(page.logItems(0).eventType.text, expectedEvent.eventType);
91+
assert.equal(page.logItems(0).status.text, expectedEvent.status);
92+
assert.notOk(page.filterAction.isVisible, 'Action filter is not visible.');
93+
page.filterType.fillIn('issues');
94+
});
95+
96+
andThen(() => {
97+
assert.equal(page.logItems().count, 1, 'There are 1 log rows after filtering.');
98+
assert.equal(page.logItems(0).action.text, expectedEvent.action);
99+
assert.equal(page.logItems(0).eventType.text, expectedEvent.eventType);
100+
assert.equal(page.logItems(0).status.text, expectedEvent.status);
101+
assert.ok(page.filterAction.isVisible, 'Action filter is visible.');
102+
page.filterStatus.fillIn('opened');
103+
});
104+
105+
andThen(() => {
106+
assert.equal(page.logItems().count, 1, 'There are 1 log rows after filtering.');
107+
assert.equal(page.logItems(0).action.text, expectedEvent.action);
108+
assert.equal(page.logItems(0).eventType.text, expectedEvent.eventType);
109+
assert.equal(page.logItems(0).status.text, expectedEvent.status);
110+
page.clear.click();
111+
});
112+
113+
andThen(() => {
114+
assert.equal(page.logItems().count, 2, 'All items are listed again after clearing filters.');
115+
});
116+
});

tests/pages/admin/github-events/index.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
1-
import { collection, create, hasClass, visitable } from 'ember-cli-page-object';
1+
import { collection, create, fillable, hasClass, visitable } from 'ember-cli-page-object';
22

33
export default create({
44
visit: visitable('/admin/github/events'),
55

6+
clear: {
7+
scope: '[data-test-clear-filters]'
8+
},
9+
10+
filterAction: {
11+
scope: '[data-test-filter-action]',
12+
fillIn: fillable()
13+
},
14+
15+
filterStatus: {
16+
scope: '[data-test-filter-status]',
17+
fillIn: fillable()
18+
},
19+
20+
filterType: {
21+
scope: '[data-test-filter-type]',
22+
fillIn: fillable()
23+
},
24+
625
flashErrors: collection({
726
scope: '.flash-messages--full-width',
827
itemScope: '.flash-message.alert-danger'

0 commit comments

Comments
 (0)