Skip to content

Commit 82e288f

Browse files
committed
Add School Filter to Subject Reports
When All Schools is selected for a report add a school filter to the results so they can be refined.
1 parent 6cae368 commit 82e288f

File tree

10 files changed

+133
-9
lines changed

10 files changed

+133
-9
lines changed

packages/frontend/app/components/reports/subject-header.hbs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,11 @@
3636
{{#if @showYearFilter}}
3737
<Reports::SubjectYearFilter @selectedYear={{@year}} @changeYear={{@changeYear}} />
3838
{{/if}}
39+
{{#if @showSchoolFilter}}
40+
<Reports::Subject::SchoolFilter
41+
@selectedSchool={{@filterSchool}}
42+
@changeSchool={{@changeFilterSchool}}
43+
/>
44+
{{/if}}
3945
<Reports::SubjectDescription @description={{@description}} @resultsLength={{@resultsLength}} />
4046
</div>

packages/frontend/app/components/reports/subject-results.hbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
@school={{@school}}
88
@changeYear={{@changeYear}}
99
@year={{@year}}
10+
@filterSchool={{@filterSchool}}
11+
@changeFilterSchool={{@changeFilterSchool}}
1012
@description={{@description}}
1113
/>
1214
</div>

packages/frontend/app/components/reports/subject.hbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
@description={{p.value}}
1212
@year={{@year}}
1313
@changeYear={{@changeYear}}
14+
@filterSchool={{@filterSchool}}
15+
@changeFilterSchool={{@changeFilterSchool}}
1416
/>
1517
{{/if}}
1618
{{/let}}

packages/frontend/app/components/reports/subject/competency.hbs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<Reports::SubjectHeader
22
@report={{@report}}
33
@school={{@school}}
4+
@changeFilterSchool={{@changeFilterSchool}}
5+
@filterSchool={{@filterSchool}}
6+
@showSchoolFilter={{this.showSchoolFilter}}
47
@subject={{@subject}}
58
@prepositionalObject={{@prepositionalObject}}
69
@prepositionalObjectTableRowId={{@prepositionalObjectTableRowId}}
@@ -10,14 +13,17 @@
1013
@description={{@description}}
1114
@fetchDownloadData={{this.fetchDownloadData}}
1215
@readyToDownload={{this.allCompetenciesData.isResolved}}
13-
@resultsLength={{this.allCompetencies.length}}
16+
@resultsLength={{this.resultsLengthDisplay}}
1417
/>
1518
<div data-test-reports-subject-competency>
1619
{{#if this.allCompetenciesData.isResolved}}
1720
<ul class="report-results{{if this.reportResultsExceedMax ' limited'}}" data-test-results>
18-
{{#each this.limitedCompetencies as |title|}}
21+
{{#each this.limitedCompetencies as |o|}}
1922
<li>
20-
{{title}}
23+
{{#if (and this.showSchoolFilter (not @filterSchool))}}
24+
{{o.school.title}}:
25+
{{/if}}
26+
{{o.title}}
2127
</li>
2228
{{else}}
2329
<li>{{t "general.none"}}</li>

packages/frontend/app/components/reports/subject/competency.js

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,44 @@ export default class ReportsSubjectCompetencyComponent extends Component {
3030

3131
get sortedCompetencies() {
3232
return this.allCompetencies.sort((a, b) => {
33-
return a.localeCompare(b, this.intl.primaryLocale);
33+
if (a.school.id !== b.school.id) {
34+
return a.school.title.localeCompare(b.school.title, this.intl.primaryLocale);
35+
}
36+
return a.title.localeCompare(b.title, this.intl.primaryLocale);
37+
});
38+
}
39+
40+
get filteredCompetencies() {
41+
if (!this.args.filterSchool) {
42+
return this.sortedCompetencies;
43+
}
44+
45+
return this.sortedCompetencies.filter((competency) => {
46+
return competency.school.id === this.args.filterSchool;
3447
});
3548
}
3649

3750
get limitedCompetencies() {
38-
return this.sortedCompetencies.slice(0, this.resultsLengthMax);
51+
return this.filteredCompetencies.slice(0, this.resultsLengthMax);
52+
}
53+
54+
get resultsLengthDisplay() {
55+
const total = this.allCompetencies.length;
56+
const filtered = this.filteredCompetencies.length;
57+
58+
if (total === filtered) {
59+
return total;
60+
}
61+
return `${filtered}/${total}`;
62+
}
63+
64+
get showSchoolFilter() {
65+
if (this.args.school) {
66+
return false;
67+
}
68+
69+
const uniqueSchools = [...new Set(this.allCompetencies.map((o) => o.school.id))];
70+
return uniqueSchools.length > 1;
3971
}
4072

4173
async getReportResults(subject, prepositionalObject, prepositionalObjectTableRowId, school) {
@@ -51,8 +83,12 @@ export default class ReportsSubjectCompetencyComponent extends Component {
5183
const what = pluralize(camelize(prepositionalObject));
5284
filters.push(`${what}: [${prepositionalObjectTableRowId}]`);
5385
}
54-
const result = await this.graphql.find('competencies', filters, 'id, title');
55-
return result.data.competencies.map(({ title }) => title);
86+
const result = await this.graphql.find(
87+
'competencies',
88+
filters,
89+
'id, title, school { id, title }',
90+
);
91+
return result.data.competencies;
5692
}
5793

5894
get reportResultsExceedMax() {
@@ -61,6 +97,20 @@ export default class ReportsSubjectCompetencyComponent extends Component {
6197

6298
@action
6399
async fetchDownloadData() {
64-
return [[this.intl.t('general.competencies')], ...this.sortedCompetencies.map((v) => [v])];
100+
const headers = [];
101+
if (!this.args.school) {
102+
headers.push(this.intl.t('general.school'));
103+
}
104+
headers.push(this.intl.t('general.competency'));
105+
const map = this.sortedCompetencies.map((o) => {
106+
const rhett = [];
107+
if (!this.args.school) {
108+
rhett.push(o.school.title);
109+
}
110+
rhett.push(o.title);
111+
112+
return rhett;
113+
});
114+
return [headers, ...map];
65115
}
66116
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<div class="school-filter" data-test-report-subject-school-filter>
2+
<label>{{t "general.school"}}
3+
<select data-test-school-filter {{on "change" (pick "target.value" @changeSchool)}}>
4+
<option selected={{is-empty @selectedSchool}} value="">
5+
{{t "general.allSchools"}}
6+
</option>
7+
{{#each (sort-by "title:desc" this.allSchools) as |school|}}
8+
<option value={{school.id}} selected={{eq school.id @selectedSchool}}>
9+
{{school.title}}
10+
</option>
11+
{{/each}}
12+
</select>
13+
</label>
14+
</div>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Component from '@glimmer/component';
2+
import { TrackedAsyncData } from 'ember-async-data';
3+
import { cached } from '@glimmer/tracking';
4+
import { service } from '@ember/service';
5+
6+
export default class ReportsSubjectSchoolFilterComponent extends Component {
7+
@service store;
8+
9+
@cached
10+
get allSchoolsData() {
11+
return new TrackedAsyncData(this.store.findAll('school'));
12+
}
13+
14+
get allSchools() {
15+
return this.allSchoolsData.isResolved ? this.allSchoolsData.value : [];
16+
}
17+
}

packages/frontend/app/controllers/reports/subject.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import { tracked } from '@glimmer/tracking';
55
export default class ReportsSubjectController extends Controller {
66
@service store;
77

8-
queryParams = ['report', 'reportYear'];
8+
queryParams = ['report', 'reportYear', 'filterSchool'];
99

1010
@tracked report = null;
1111
@tracked reportYear = '';
12+
@tracked filterSchool = null;
1213
}

packages/frontend/app/templates/reports/subject.hbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33
@report={{this.model}}
44
@year={{this.reportYear}}
55
@changeYear={{set this "reportYear"}}
6+
@filterSchool={{this.filterSchool}}
7+
@changeFilterSchool={{set this "filterSchool"}}
68
/>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { module, test } from 'qunit';
2+
import { setupRenderingTest } from 'frontend/tests/helpers';
3+
import { render } from '@ember/test-helpers';
4+
import { hbs } from 'ember-cli-htmlbars';
5+
6+
module('Integration | Component | reports/subject/school-filter', function (hooks) {
7+
setupRenderingTest(hooks);
8+
9+
test('it renders', async function (assert) {
10+
// Set any properties with this.set('myProperty', 'value');
11+
// Handle any actions with this.set('myAction', function(val) { ... });
12+
13+
await render(hbs`<Reports::Subject::SchoolFilter />`);
14+
15+
assert.dom().hasText('');
16+
17+
// Template block usage:
18+
await render(hbs`<Reports::Subject::SchoolFilter>
19+
template block text
20+
</Reports::Subject::SchoolFilter>`);
21+
22+
assert.dom().hasText('template block text');
23+
});
24+
});

0 commit comments

Comments
 (0)