Skip to content

Commit

Permalink
realigns Curr Inv Expanded Leadership component with equivalents.
Browse files Browse the repository at this point in the history
replace the modifier-based data loading process with a tracked-resource
one already used in leadership mngmt components for programs and
program-years.
align the related testing components as well while at it.
  • Loading branch information
stopfstedt committed Mar 21, 2024
1 parent e135037 commit 6442f4d
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 96 deletions.
Original file line number Diff line number Diff line change
@@ -1,56 +1,51 @@
<div
class="curriculum-inventory-leadership-expanded"
data-test-curriculum-inventory-leadership-expanded
{{did-insert (perform this.load) @report}}
>
{{#if this.load.isRunning}}
<LoadingSpinner />
{{else}}
<div class="curriculum-inventory-leadership-expanded-header" data-test-header>
<button
class="title link-button"
type="button"
aria-expanded="true"
data-test-title
{{on "click" @collapse}}
>
{{t "general.leadership"}} ({{this.count}})
<FaIcon @icon="caret-down" />
</button>
<div class="actions">
{{#if @isManaging}}
<button type="button" class="bigadd" {{on "click" (perform this.save)}} data-test-save>
<FaIcon
@icon={{if this.save.isRunning "spinner" "check"}}
@spin={{this.save.isRunning}}
/>
</button>
<button type="button" class="bigcancel" {{on "click" (perform this.cancel)}} data-test-cancel>
<FaIcon @icon="arrow-rotate-left" />
</button>
{{else if @canUpdate}}
<button type="button" {{on "click" this.manage}} data-test-manage>
{{t "general.manageLeadership"}}
</button>
{{/if}}
</div>
</div>
<div class="curriculum-inventory-leadership-expanded-content" data-test-content>
<div class="curriculum-inventory-leadership-expanded-header" data-test-header>
<button
class="title link-button"
type="button"
aria-expanded="true"
data-test-title
{{on "click" @collapse}}
>
{{t "general.leadership"}} ({{this.count}})
<FaIcon @icon="caret-down" />
</button>
<div class="actions">
{{#if @isManaging}}
<LeadershipManager
@showAdministrators={{true}}
@showDirectors={{false}}
@administrators={{this.administrators}}
@removeAdministrator={{this.removeAdministrator}}
@addAdministrator={{this.addAdministrator}}
/>
{{else}}
<LeadershipList
@showAdministrators={{true}}
@showDirectors={{false}}
@administrators={{this.administrators}}
/>
<button type="button" class="bigadd" {{on "click" (perform this.save)}} data-test-save>
<FaIcon
@icon={{if this.save.isRunning "spinner" "check"}}
@spin={{this.save.isRunning}}
/>
</button>
<button type="button" class="bigcancel" {{on "click" this.close}} data-test-cancel>
<FaIcon @icon="arrow-rotate-left" />
</button>
{{else if @editable}}
<button type="button" {{on "click" (fn @setIsManaging true)}} data-test-manage>
{{t "general.manageLeadership"}}
</button>
{{/if}}
</div>
{{/if}}
</div>
<div class="curriculum-inventory-leadership-expanded-content" data-test-content>
{{#if @isManaging}}
<LeadershipManager
@showAdministrators={{true}}
@showDirectors={{false}}
@administrators={{this.administrators}}
@removeAdministrator={{this.removeAdministrator}}
@addAdministrator={{this.addAdministrator}}
/>
{{else}}
<LeadershipList
@showAdministrators={{true}}
@showDirectors={{false}}
@administrators={{this.administrators}}
/>
{{/if}}
</div>
</div>
Original file line number Diff line number Diff line change
@@ -1,47 +1,62 @@
import Component from '@glimmer/component';
import { dropTask, timeout } from 'ember-concurrency';
import { action } from '@ember/object';
import { dropTask } from 'ember-concurrency';
import { tracked } from '@glimmer/tracking';
import { TrackedAsyncData } from 'ember-async-data';
import { cached } from '@glimmer/tracking';
import { action } from '@ember/object';

export default class CurriculumInventoryLeadershipExpandedComponent extends Component {
@tracked administrators = [];
@tracked administratorsToAdd = [];
@tracked administratorsToRemove = [];

@cached
get count() {
return this.administrators.length;
}

@cached
get reportAdministrators() {
return new TrackedAsyncData(this.args.report.administrators);
}

@cached
get administrators() {
const administrators = this.reportAdministrators.isResolved
? this.reportAdministrators.value.slice()
: [];
return [...administrators, ...this.administratorsToAdd].filter(
(user) => !this.administratorsToRemove.includes(user),
);
}

resetBuffers() {
this.administratorsToAdd = [];
this.administratorsToRemove = [];
}

@action
addAdministrator(user) {
this.administrators = [...this.administrators, user];
this.administratorsToAdd = [...this.administratorsToAdd, user];
this.administratorsToRemove = this.administratorsToRemove.filter((d) => d !== user);
}

@action
removeAdministrator(user) {
this.administrators = this.administrators.filter(({ id }) => id !== user.id);
}

async setBuffers() {
this.administrators = (await this.args.report.administrators).slice();
this.administratorsToRemove = [...this.administratorsToRemove, user];
this.administratorsToAdd = this.administratorsToAdd.filter((d) => d !== user);
}

@action
manage() {
this.args.setIsManaging(true);
close() {
this.resetBuffers();
this.args.setIsManaging(false);
}

load = dropTask(async () => {
await this.setBuffers();
});

save = dropTask(async () => {
await timeout(10);
this.args.report.set('administrators', this.administrators);
this.args.expand();
this.resetBuffers();
await this.args.report.save();
this.args.setIsManaging(false);
});

cancel = dropTask(async () => {
await this.setBuffers();
this.args.setIsManaging(false);
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
{{#if @leadershipDetails}}
<CurriculumInventory::LeadershipExpanded
@report={{@report}}
@canUpdate={{this.canUpdate}}
@editable={{this.canUpdate}}
@collapse={{fn @setLeadershipDetails false}}
@expand={{fn @setLeadershipDetails true}}
@isManaging={{@manageLeadership}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ module('Acceptance | curriculum inventory leadership', function (hooks) {

test('list leadership', async function (assert) {
await page.visit({ reportId: this.reportModel.id, leadershipDetails: true });
assert.strictEqual(page.details.leadershipExpanded.collapse.text, 'Leadership (2)');
assert.strictEqual(page.details.leadershipExpanded.title, 'Leadership (2)');
const { administrators } = page.details.leadershipExpanded.leadershipList;
assert.strictEqual(administrators.length, 2);
assert.strictEqual(administrators[0].text, '3 guy M. Mc3son');
Expand All @@ -48,7 +48,7 @@ module('Acceptance | curriculum inventory leadership', function (hooks) {

test('search administrators', async function (assert) {
await page.visit({ reportId: this.reportModel.id, leadershipDetails: true });
await page.details.leadershipExpanded.manage.click();
await page.details.leadershipExpanded.manage();
const manager = page.details.leadershipExpanded.leadershipManager;
await manager.administratorSearch.search('guy');
assert.strictEqual(manager.administratorSearch.results.length, 5);
Expand Down Expand Up @@ -81,7 +81,7 @@ module('Acceptance | curriculum inventory leadership', function (hooks) {

test('manage leadership', async function (assert) {
await page.visit({ reportId: this.reportModel.id, leadershipDetails: true });
await page.details.leadershipExpanded.manage.click();
await page.details.leadershipExpanded.manage();
const manager = page.details.leadershipExpanded.leadershipManager;
const { selectedAdministrators } = manager;
assert.strictEqual(selectedAdministrators.length, 2);
Expand All @@ -97,13 +97,13 @@ module('Acceptance | curriculum inventory leadership', function (hooks) {

test('cancel leadership changes', async function (assert) {
await page.visit({ reportId: this.reportModel.id, leadershipDetails: true });
await page.details.leadershipExpanded.manage.click();
await page.details.leadershipExpanded.manage();
const manager = page.details.leadershipExpanded.leadershipManager;
const { selectedAdministrators } = manager;
await selectedAdministrators[1].remove();
await manager.administratorSearch.search('guy');
await manager.administratorSearch.results[1].add();
await page.details.leadershipExpanded.cancel.click();
await page.details.leadershipExpanded.cancel();
const { administrators } = page.details.leadershipExpanded.leadershipList;
assert.strictEqual(administrators.length, 2);
assert.strictEqual(administrators[0].text, '3 guy M. Mc3son');
Expand All @@ -112,13 +112,13 @@ module('Acceptance | curriculum inventory leadership', function (hooks) {

test('save leadership changes', async function (assert) {
await page.visit({ reportId: this.reportModel.id, leadershipDetails: true });
await page.details.leadershipExpanded.manage.click();
await page.details.leadershipExpanded.manage();
const manager = page.details.leadershipExpanded.leadershipManager;
const { selectedAdministrators } = manager;
await selectedAdministrators[1].remove();
await manager.administratorSearch.search('guy');
await manager.administratorSearch.results[1].add();
await page.details.leadershipExpanded.save.click();
await page.details.leadershipExpanded.save();
const { administrators } = page.details.leadershipExpanded.leadershipList;
assert.strictEqual(administrators.length, 2);
assert.strictEqual(administrators[0].text, '1 guy M. Mc1son');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,12 @@ module('Integration | Component | curriculum-inventory/leadership-expanded', fun
this.set('report', reportModel);
await render(hbs`<CurriculumInventory::LeadershipExpanded
@report={{this.report}}
@canUpdate={{true}}
@editable={{true}}
@collapse={{(noop)}}
@expand={{(noop)}}
@isManaging={{false}}
@setIsManaging={{(noop)}}
/>`);
assert.ok(component.collapse.text, 'Leadership');
assert.strictEqual(component.leadershipList.administrators.length, 2);
assert.strictEqual(component.leadershipList.administrators[0].text, '0 guy M. Mc0son');
assert.strictEqual(component.leadershipList.administrators[1].text, '1 guy M. Mc1son');
Expand All @@ -47,13 +46,13 @@ module('Integration | Component | curriculum-inventory/leadership-expanded', fun
});
await render(hbs`<CurriculumInventory::LeadershipExpanded
@report={{this.report}}
@canUpdate={{true}}
@editable={{true}}
@collapse={{this.collapse}}
@expand={{(noop)}}
@isManaging={{false}}
@setIsManaging={{(noop)}}
/>`);
await component.collapse.click();
await component.collapse();
});

test('clicking manage fires action', async function (assert) {
Expand All @@ -69,12 +68,12 @@ module('Integration | Component | curriculum-inventory/leadership-expanded', fun
});
await render(hbs`<CurriculumInventory::LeadershipExpanded
@report={{this.report}}
@canUpdate={{true}}
@editable={{true}}
@collapse={{(noop)}}
@expand={{(noop)}}
@isManaging={{false}}
@setIsManaging={{this.manage}}
/>`);
await component.manage.click();
await component.manage();
});
});
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
import { create } from 'ember-cli-page-object';
import { clickable, create, text } from 'ember-cli-page-object';
import leadershipList from 'ilios-common/page-objects/components/leadership-list';
import leadershipManager from 'ilios-common/page-objects/components/leadership-manager';

const definition = {
scope: '[data-test-curriculum-inventory-leadership-expanded]',
collapse: {
scope: '[data-test-title]',
},
manage: {
scope: '[data-test-manage]',
},
save: {
scope: '[data-test-save]',
},
cancel: {
scope: '[data-test-cancel]',
},
title: text('[data-test-title]'),
collapse: clickable('[data-test-title]'),
manage: clickable('[data-test-manage]'),
save: clickable('[data-test-save]'),
cancel: clickable('[data-test-cancel]'),
leadershipList,
leadershipManager,
};
Expand Down

0 comments on commit 6442f4d

Please sign in to comment.