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, };