diff --git a/packages/frontend/app/components/reports/subject-header.hbs b/packages/frontend/app/components/reports/subject-header.hbs
index f23b84b4c2..c24f2d6d2c 100644
--- a/packages/frontend/app/components/reports/subject-header.hbs
+++ b/packages/frontend/app/components/reports/subject-header.hbs
@@ -36,5 +36,11 @@
{{#if @showYearFilter}}
{{/if}}
+ {{#if @showSchoolFilter}}
+
+ {{/if}}
\ No newline at end of file
diff --git a/packages/frontend/app/components/reports/subject-results.hbs b/packages/frontend/app/components/reports/subject-results.hbs
index 6c13cc9c93..a14de26e69 100644
--- a/packages/frontend/app/components/reports/subject-results.hbs
+++ b/packages/frontend/app/components/reports/subject-results.hbs
@@ -7,6 +7,8 @@
@school={{@school}}
@changeYear={{@changeYear}}
@year={{@year}}
+ @filterSchool={{@filterSchool}}
+ @changeFilterSchool={{@changeFilterSchool}}
@description={{@description}}
/>
\ No newline at end of file
diff --git a/packages/frontend/app/components/reports/subject.hbs b/packages/frontend/app/components/reports/subject.hbs
index e607da26fc..c9dd7f2735 100644
--- a/packages/frontend/app/components/reports/subject.hbs
+++ b/packages/frontend/app/components/reports/subject.hbs
@@ -11,6 +11,8 @@
@description={{p.value}}
@year={{@year}}
@changeYear={{@changeYear}}
+ @filterSchool={{@filterSchool}}
+ @changeFilterSchool={{@changeFilterSchool}}
/>
{{/if}}
{{/let}}
diff --git a/packages/frontend/app/components/reports/subject/competency.hbs b/packages/frontend/app/components/reports/subject/competency.hbs
index 7772e36659..d5206f2dde 100644
--- a/packages/frontend/app/components/reports/subject/competency.hbs
+++ b/packages/frontend/app/components/reports/subject/competency.hbs
@@ -1,6 +1,9 @@
{{#if this.allCompetenciesData.isResolved}}
- {{#each this.limitedCompetencies as |title|}}
+ {{#each this.limitedCompetencies as |o|}}
-
- {{title}}
+ {{#if (and this.showSchoolFilter (not @filterSchool))}}
+ {{o.school.title}}:
+ {{/if}}
+ {{o.title}}
{{else}}
- {{t "general.none"}}
diff --git a/packages/frontend/app/components/reports/subject/competency.js b/packages/frontend/app/components/reports/subject/competency.js
index c1653bfd20..da04bea4ed 100644
--- a/packages/frontend/app/components/reports/subject/competency.js
+++ b/packages/frontend/app/components/reports/subject/competency.js
@@ -30,12 +30,44 @@ export default class ReportsSubjectCompetencyComponent extends Component {
get sortedCompetencies() {
return this.allCompetencies.sort((a, b) => {
- return a.localeCompare(b, this.intl.primaryLocale);
+ if (a.school.id !== b.school.id) {
+ return a.school.title.localeCompare(b.school.title, this.intl.primaryLocale);
+ }
+ return a.title.localeCompare(b.title, this.intl.primaryLocale);
+ });
+ }
+
+ get filteredCompetencies() {
+ if (!this.args.filterSchool) {
+ return this.sortedCompetencies;
+ }
+
+ return this.sortedCompetencies.filter((competency) => {
+ return competency.school.id === this.args.filterSchool;
});
}
get limitedCompetencies() {
- return this.sortedCompetencies.slice(0, this.resultsLengthMax);
+ return this.filteredCompetencies.slice(0, this.resultsLengthMax);
+ }
+
+ get resultsLengthDisplay() {
+ const total = this.allCompetencies.length;
+ const filtered = this.filteredCompetencies.length;
+
+ if (total === filtered) {
+ return total;
+ }
+ return `${filtered}/${total}`;
+ }
+
+ get showSchoolFilter() {
+ if (this.args.school) {
+ return false;
+ }
+
+ const uniqueSchools = [...new Set(this.allCompetencies.map((o) => o.school.id))];
+ return uniqueSchools.length > 1;
}
async getReportResults(subject, prepositionalObject, prepositionalObjectTableRowId, school) {
@@ -51,8 +83,12 @@ export default class ReportsSubjectCompetencyComponent extends Component {
const what = pluralize(camelize(prepositionalObject));
filters.push(`${what}: [${prepositionalObjectTableRowId}]`);
}
- const result = await this.graphql.find('competencies', filters, 'id, title');
- return result.data.competencies.map(({ title }) => title);
+ const result = await this.graphql.find(
+ 'competencies',
+ filters,
+ 'id, title, school { id, title }',
+ );
+ return result.data.competencies;
}
get reportResultsExceedMax() {
@@ -61,6 +97,20 @@ export default class ReportsSubjectCompetencyComponent extends Component {
@action
async fetchDownloadData() {
- return [[this.intl.t('general.competencies')], ...this.sortedCompetencies.map((v) => [v])];
+ const headers = [];
+ if (!this.args.school) {
+ headers.push(this.intl.t('general.school'));
+ }
+ headers.push(this.intl.t('general.competency'));
+ const map = this.sortedCompetencies.map((o) => {
+ const rhett = [];
+ if (!this.args.school) {
+ rhett.push(o.school.title);
+ }
+ rhett.push(o.title);
+
+ return rhett;
+ });
+ return [headers, ...map];
}
}
diff --git a/packages/frontend/app/components/reports/subject/school-filter.hbs b/packages/frontend/app/components/reports/subject/school-filter.hbs
new file mode 100644
index 0000000000..a7feca9748
--- /dev/null
+++ b/packages/frontend/app/components/reports/subject/school-filter.hbs
@@ -0,0 +1,14 @@
+
+
+
\ No newline at end of file
diff --git a/packages/frontend/app/components/reports/subject/school-filter.js b/packages/frontend/app/components/reports/subject/school-filter.js
new file mode 100644
index 0000000000..a74ed9481e
--- /dev/null
+++ b/packages/frontend/app/components/reports/subject/school-filter.js
@@ -0,0 +1,17 @@
+import Component from '@glimmer/component';
+import { TrackedAsyncData } from 'ember-async-data';
+import { cached } from '@glimmer/tracking';
+import { service } from '@ember/service';
+
+export default class ReportsSubjectSchoolFilterComponent extends Component {
+ @service store;
+
+ @cached
+ get allSchoolsData() {
+ return new TrackedAsyncData(this.store.findAll('school'));
+ }
+
+ get allSchools() {
+ return this.allSchoolsData.isResolved ? this.allSchoolsData.value : [];
+ }
+}
diff --git a/packages/frontend/app/controllers/reports/subject.js b/packages/frontend/app/controllers/reports/subject.js
index 6646086be5..d0ab7d7b77 100644
--- a/packages/frontend/app/controllers/reports/subject.js
+++ b/packages/frontend/app/controllers/reports/subject.js
@@ -5,8 +5,9 @@ import { tracked } from '@glimmer/tracking';
export default class ReportsSubjectController extends Controller {
@service store;
- queryParams = ['report', 'reportYear'];
+ queryParams = ['report', 'reportYear', 'filterSchool'];
@tracked report = null;
@tracked reportYear = '';
+ @tracked filterSchool = null;
}
diff --git a/packages/frontend/app/templates/reports/subject.hbs b/packages/frontend/app/templates/reports/subject.hbs
index 4d13783b0d..8a50f5ce83 100644
--- a/packages/frontend/app/templates/reports/subject.hbs
+++ b/packages/frontend/app/templates/reports/subject.hbs
@@ -3,4 +3,6 @@
@report={{this.model}}
@year={{this.reportYear}}
@changeYear={{set this "reportYear"}}
+ @filterSchool={{this.filterSchool}}
+ @changeFilterSchool={{set this "filterSchool"}}
/>
\ No newline at end of file
diff --git a/packages/frontend/tests/integration/components/reports/subject/school-filter-test.js b/packages/frontend/tests/integration/components/reports/subject/school-filter-test.js
new file mode 100644
index 0000000000..0f245a95b3
--- /dev/null
+++ b/packages/frontend/tests/integration/components/reports/subject/school-filter-test.js
@@ -0,0 +1,24 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'frontend/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | reports/subject/school-filter', 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) { ... });
+
+ await render(hbs``);
+
+ assert.dom().hasText('');
+
+ // Template block usage:
+ await render(hbs`
+ template block text
+`);
+
+ assert.dom().hasText('template block text');
+ });
+});