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'); + }); +});