diff --git a/packages/frontend/app/components/curriculum-inventory/leadership-expanded.hbs b/packages/frontend/app/components/curriculum-inventory/leadership-expanded.hbs
index a376d08fea..4c60145276 100644
--- a/packages/frontend/app/components/curriculum-inventory/leadership-expanded.hbs
+++ b/packages/frontend/app/components/curriculum-inventory/leadership-expanded.hbs
@@ -1,56 +1,51 @@
- {{#if this.load.isRunning}}
-
- {{else}}
-
-
-
- {{#if @isManaging}}
-
-
- {{else if @canUpdate}}
-
- {{/if}}
-
-
-
+
+
+
{{#if @isManaging}}
-
- {{else}}
-
+
+
+ {{else if @editable}}
+
{{/if}}
- {{/if}}
+
+
+ {{#if @isManaging}}
+
+ {{else}}
+
+ {{/if}}
+
diff --git a/packages/frontend/app/components/curriculum-inventory/leadership-expanded.js b/packages/frontend/app/components/curriculum-inventory/leadership-expanded.js
index 450bfaca6c..4d744e7c8b 100644
--- a/packages/frontend/app/components/curriculum-inventory/leadership-expanded.js
+++ b/packages/frontend/app/components/curriculum-inventory/leadership-expanded.js
@@ -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);
- });
}
diff --git a/packages/frontend/app/components/curriculum-inventory/report-details.hbs b/packages/frontend/app/components/curriculum-inventory/report-details.hbs
index 5b4d2dfd7b..0236dfe2fb 100644
--- a/packages/frontend/app/components/curriculum-inventory/report-details.hbs
+++ b/packages/frontend/app/components/curriculum-inventory/report-details.hbs
@@ -38,7 +38,7 @@
{{#if @leadershipDetails}}
`);
- 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');
@@ -47,13 +46,13 @@ module('Integration | Component | curriculum-inventory/leadership-expanded', fun
});
await render(hbs`
`);
- await component.collapse.click();
+ await component.collapse();
});
test('clicking manage fires action', async function (assert) {
@@ -69,12 +68,12 @@ module('Integration | Component | curriculum-inventory/leadership-expanded', fun
});
await render(hbs`
`);
- await component.manage.click();
+ await component.manage();
});
});
diff --git a/packages/frontend/tests/pages/components/curriculum-inventory/leadership-expanded.js b/packages/frontend/tests/pages/components/curriculum-inventory/leadership-expanded.js
index bd8867cf81..d3ff985e0f 100644
--- a/packages/frontend/tests/pages/components/curriculum-inventory/leadership-expanded.js
+++ b/packages/frontend/tests/pages/components/curriculum-inventory/leadership-expanded.js
@@ -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,
};