Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

replaces ember-render-modifiers in curr inv report rollover component. #8261

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions packages/frontend/.lint-todo
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@ add|ember-template-lint|no-at-ember-render-modifiers|11|6|11|6|940005188b476a060
add|ember-template-lint|no-at-ember-render-modifiers|5|2|5|2|23cd787c79c34a628dadb6e96dd4004d42eebb79|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/new-report.hbs
add|ember-template-lint|no-at-ember-render-modifiers|4|2|4|2|23cd787c79c34a628dadb6e96dd4004d42eebb79|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/new-sequence-block.hbs
add|ember-template-lint|no-at-ember-render-modifiers|5|2|5|2|77e3831e4ae1b00caee1f808711f2e26ab452a23|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/new-sequence-block.hbs
add|ember-template-lint|no-at-ember-render-modifiers|3|2|3|2|23cd787c79c34a628dadb6e96dd4004d42eebb79|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/report-rollover.hbs
add|ember-template-lint|no-at-ember-render-modifiers|4|2|4|2|5e634ade97cc174a33ee6f2fdce6c42465ec31e3|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/report-rollover.hbs
add|ember-template-lint|no-at-ember-render-modifiers|5|2|5|2|c34ed16d221405a625e5c23907f49fd55e6ba231|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/sequence-block-header.hbs
add|ember-template-lint|no-at-ember-render-modifiers|6|2|6|2|6236d751dee8e47f88ffd257c6bfcec223f2b91c|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/sequence-block-header.hbs
add|ember-template-lint|no-at-ember-render-modifiers|4|2|4|2|e65bc0e9138a1521733c31ef990721569f51eb20|1733184000000|1735776000000|1738368000000|app/components/curriculum-inventory/sequence-block-overview.hbs
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
<div
class="curriculum-inventory-report-rollover"
{{did-insert (perform this.load)}}
{{did-update (perform this.load) @report}}
data-test-curriculum-inventory-report-rollover
>
<div class="curriculum-inventory-report-rollover" data-test-curriculum-inventory-report-rollover>
{{#unless this.load.isRunning}}
<div class="rollover-form" {{scroll-into-view}}>
<h3 class="title">
Expand Down Expand Up @@ -56,39 +51,41 @@
{{#each this.years as |obj|}}
<option
value={{obj.year}}
selected={{eq obj.year this.selectedYear}}
selected={{eq obj.year this.defaultYear}}
>{{obj.title}}</option>
{{/each}}
</select>
{{/let}}
</div>
<div class="item programs" data-test-programs>
{{#let (unique-id) as |programId|}}
<label for={{programId}}>
{{t "general.program"}}:
</label>
{{#if (gt this.programs.length 1)}}
<select
id={{programId}}
disabled={{this.save.isRunning}}
{{on "change" (pick "target.value" this.changeProgram)}}
>
{{#each (sort-by "title" this.programs) as |program|}}
<option value={{program.id}} selected={{eq program this.selectedProgram}}>
{{program.title}}
</option>
{{/each}}
</select>
{{else}}
{{this.selectedProgram.title}}
{{/if}}
{{/let}}
{{#if this.programsDataLoaded}}
{{#let (unique-id) as |programId|}}
<label for={{programId}}>
{{t "general.program"}}:
</label>
{{#if (gt this.programs.length 1)}}
<select
id={{programId}}
disabled={{this.save.isRunning}}
{{on "change" (pick "target.value" this.changeProgram)}}
>
{{#each (sort-by "title" this.programs) as |program|}}
<option value={{program.id}} selected={{eq program this.defaultProgram}}>
{{program.title}}
</option>
{{/each}}
</select>
{{else}}
{{this.defaultProgram.title}}
{{/if}}
{{/let}}
{{/if}}
</div>
<div class="buttons">
<button
type="button"
class="done text"
disabled={{this.save.isRunning}}
disabled={{or (not this.programsDataLoaded) this.save.isRunning}}
{{on "click" (perform this.save)}}
data-test-save
>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { cached, tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { service } from '@ember/service';
import { dropTask, restartableTask } from 'ember-concurrency';
import { dropTask } from 'ember-concurrency';
import { TrackedAsyncData } from 'ember-async-data';
import { validatable, Length, NotBlank } from 'ilios-common/decorators/validation';
import { findBy, findById } from 'ilios-common/utils/array-helpers';

Expand All @@ -13,48 +14,96 @@ export default class CurriculumInventoryReportRolloverComponent extends Componen
@service iliosConfig;
@service store;

currentYear = new Date().getFullYear();
@tracked @NotBlank() @Length(3, 200) name;
@tracked @NotBlank() @Length(1, 21844) description;
@tracked selectedYear;
@tracked years = [];
@tracked selectedProgram;
@tracked programs = [];

load = restartableTask(async () => {
const academicYearCrossesCalendarYearBoundaries = await this.iliosConfig.itemFromConfig(
'academicYearCrossesCalendarYearBoundaries',
constructor() {
super(...arguments);
this.name = this.args.report.name;
this.description = this.args.report.description;
}

@cached
get academicYearCrossesCalendarYearBoundariesData() {
return new TrackedAsyncData(
this.iliosConfig.itemFromConfig('academicYearCrossesCalendarYearBoundaries'),
);
const thisYear = new Date().getFullYear();
const reportYear = parseInt(this.args.report.year, 10);
const startYear = Math.min(thisYear, reportYear);
const endYear = Math.max(thisYear, reportYear) + 5;
const years = [];
for (let i = startYear; i < endYear; i++) {
if (i === reportYear) {
}

get academicYearCrossesCalendarYearBoundaries() {
return this.academicYearCrossesCalendarYearBoundariesData.isResolved
? this.academicYearCrossesCalendarYearBoundariesData.value
: false;
}

get reportYear() {
return parseInt(this.args.report.year, 10);
}

get startYear() {
return Math.min(this.currentYear, this.reportYear);
}

get endYear() {
return Math.max(this.currentYear, this.reportYear) + 5;
}

get years() {
const rhett = [];
for (let i = this.startYear; i < this.endYear; i++) {
// Rollover into the same year as the source report's year is VERBOTEN.
if (i === this.reportYear) {
continue;
}
const title = academicYearCrossesCalendarYearBoundaries ? `${i} - ${i + 1}` : i.toString();
years.push({
const title = this.academicYearCrossesCalendarYearBoundaries
? `${i} - ${i + 1}`
: i.toString();
rhett.push({
year: i,
title,
});
}
let selectedYear = findBy(years, 'year', startYear + 1);
return rhett;
}

get defaultYear() {
let selectedYear = findBy(this.years, 'year', this.startYear + 1);
if (!selectedYear) {
selectedYear = findBy(years, 'year', reportYear + 1);
selectedYear = findBy(this.years, 'year', this.reportYear + 1);
}
return selectedYear.year;
}

@cached
get programsData() {
return new TrackedAsyncData(this.getPrograms(this.args.report));
}

const program = await this.args.report.program;
get programs() {
return this.programsData.isResolved ? this.programsData.value : [];
}

async getPrograms(report) {
const program = await report.program;
const school = await program.school;
const programs = await school.programs;
return school.programs;
}

this.selectedProgram = program;
this.programs = programs;
this.years = years;
this.selectedYear = selectedYear.year;
this.name = this.args.report.name;
this.description = this.args.report.description;
});
@cached
get defaultProgramData() {
return new TrackedAsyncData(this.args.report.program);
}

get defaultProgram() {
return this.defaultProgramData.isResolved ? this.defaultProgramData.value : null;
}

get programsDataLoaded() {
return this.defaultProgramData.isResolved && this.programsData.isResolved;
}

@action
changeName(newName) {
Expand Down Expand Up @@ -87,8 +136,8 @@ export default class CurriculumInventoryReportRolloverComponent extends Componen
const data = {
name: this.name,
description: this.description,
year: this.selectedYear,
program: this.selectedProgram.id,
year: this.selectedYear ? this.selectedYear : this.defaultYear,
program: this.selectedProgram ? this.selectedProgram.id : this.defaultProgram.id,
};
const url = `curriculuminventoryreports/${this.args.report.id}/rollover`;
const newReportObj = await this.fetch.postQueryToApi(url, data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,44 @@ module('Integration | Component | curriculum-inventory/report-rollover', functio
assert.strictEqual(component.years.options[1].text, `${thisYear + 2}`);
assert.strictEqual(component.years.options[2].text, `${thisYear + 3}`);
assert.strictEqual(component.years.options[3].text, `${thisYear + 4}`);
assert.ok(component.years.options[0].isSelected);
assert.notOk(component.years.options[1].isSelected);
assert.notOk(component.years.options[2].isSelected);
assert.notOk(component.years.options[3].isSelected);
assert.strictEqual(component.name.value, reportModel.name);
assert.strictEqual(component.description.value, reportModel.description);
assert.strictEqual(component.programs.text, 'Program: program 0');
});

test('multiple target programs, source program is selected by default', async function (assert) {
const thisYear = DateTime.fromObject({ hour: 8 }).year;
const school = this.server.create('school');
const program = this.server.create('program', { school, title: 'Zeppelin' });
this.server.createList('program', 3, { school });
const report = this.server.create('curriculum-inventory-report', {
name: 'old report',
description: 'this is an old report',
year: thisYear,
program,
});
const reportModel = await this.owner
.lookup('service:store')
.findRecord('curriculum-inventory-report', report.id);
this.set('report', reportModel);

await render(hbs`<CurriculumInventory::ReportRollover @report={{this.report}} />`);

assert.strictEqual(component.programs.options.length, 4);
assert.strictEqual(component.programs.options[0].text, 'program 1');
assert.strictEqual(component.programs.options[1].text, 'program 2');
assert.strictEqual(component.programs.options[2].text, 'program 3');
assert.strictEqual(component.programs.options[3].text, 'Zeppelin');
assert.notOk(component.programs.options[0].isSelected);
assert.notOk(component.programs.options[1].isSelected);
assert.notOk(component.programs.options[2].isSelected);
assert.ok(component.programs.options[3].isSelected);
});

test('academic years labeled as range if configured accordingly', async function (assert) {
this.server.get('application/config', function () {
return {
Expand Down Expand Up @@ -69,6 +102,39 @@ module('Integration | Component | curriculum-inventory/report-rollover', functio
assert.strictEqual(component.years.options[3].text, `${thisYear + 4} - ${thisYear + 5}`);
});

test('rollover report with future year', async function (assert) {
const thisYear = DateTime.fromObject({ hour: 8 }).year;
const sourceYear = thisYear + 1;
const school = this.server.create('school');
const program = this.server.create('program', { school });
const report = this.server.create('curriculum-inventory-report', {
name: 'old report',
description: 'this is an old report',
year: sourceYear,
program,
});
const reportModel = await this.owner
.lookup('service:store')
.findRecord('curriculum-inventory-report', report.id);
this.set('report', reportModel);

await render(hbs`<CurriculumInventory::ReportRollover @report={{this.report}} />`);
assert.strictEqual(component.years.options.length, 5);
assert.strictEqual(component.years.options[0].text, `${thisYear}`);
assert.strictEqual(component.years.options[1].text, `${thisYear + 2}`);
assert.strictEqual(component.years.options[2].text, `${thisYear + 3}`);
assert.strictEqual(component.years.options[3].text, `${thisYear + 4}`);
assert.strictEqual(component.years.options[4].text, `${thisYear + 5}`);
assert.notOk(component.years.options[0].isSelected);
assert.ok(
component.years.options[1].isSelected,
'the year following the source year is selected.',
);
assert.notOk(component.years.options[2].isSelected);
assert.notOk(component.years.options[3].isSelected);
assert.notOk(component.years.options[4].isSelected);
});

test('rollover report', async function (assert) {
assert.expect(6);
const school = this.server.create('school');
Expand Down
Loading