From c7a6a6ef67039934ee795964e41f3c41c5152bd1 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Tue, 2 Apr 2024 09:36:11 -0700 Subject: [PATCH 1/4] replace permission-checker Resource with TrackedAsyncData equivalent. --- .../app/components/courses/list-item.js | 34 ++++++++++++++---- .../frontend/app/components/courses/root.hbs | 2 +- .../frontend/app/components/courses/root.js | 19 +++++++--- .../curriculum-inventory/report-list-item.js | 16 +++++---- .../components/instructor-groups/list-item.js | 21 ++++++----- .../app/components/instructor-groups/root.js | 24 ++++++++----- .../app/components/learner-group/list-item.js | 33 +++++++++++------ .../app/components/learner-groups/root.js | 22 +++++++++--- .../app/components/program-year/list-item.js | 35 +++++++++++++------ .../app/components/programs/list-item.js | 16 ++++++--- .../frontend/app/components/programs/root.js | 21 ++++++++--- .../frontend/app/controllers/learner-group.js | 21 ++++++++--- packages/frontend/app/controllers/user.js | 11 ++++-- packages/ilios-common/.lint-todo | 3 ++ .../sessions-grid-offering-table.js | 16 ++++++--- .../addon/components/sessions-grid-row.js | 26 +++++++++++--- .../sessions-grid-offering-table-test.js | 10 ++---- .../components/sessions-grid-row-test.js | 23 ++++++------ 18 files changed, 248 insertions(+), 105 deletions(-) diff --git a/packages/frontend/app/components/courses/list-item.js b/packages/frontend/app/components/courses/list-item.js index da40021756..d0fc2c4a8a 100644 --- a/packages/frontend/app/components/courses/list-item.js +++ b/packages/frontend/app/components/courses/list-item.js @@ -1,11 +1,33 @@ import Component from '@glimmer/component'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; -import { use } from 'ember-could-get-used-to-this'; +import { service } from '@ember/service'; +import { cached } from '@glimmer/tracking'; +import { TrackedAsyncData } from 'ember-async-data'; export default class CoursesListItemComponent extends Component { - @use canLock = new PermissionChecker(() => ['canUpdateCourse', this.args.course]); - @use canUnlock = new PermissionChecker(() => ['canUnlockCourse', this.args.course]); - @use canDeletePermission = new PermissionChecker(() => ['canDeleteCourse', this.args.course]); + @service permissionChecker; + + @cached + get canLockData() { + return new TrackedAsyncData(this.permissionChecker.canUpdateCourse(this.args.course)); + } + + @cached + get canUnlockData() { + return new TrackedAsyncData(this.permissionChecker.canUnlockCourse(this.args.course)); + } + + @cached + get canDeleteData() { + return new TrackedAsyncData(this.permissionChecker.canDeleteCourse(this.args.course)); + } + + get canLock() { + return this.canLockData.isResolved ? this.canLockData.value : false; + } + + get canUnlock() { + return this.canUnlockData.isResolved ? this.canUnlockData.value : false; + } get canDelete() { if (this.args.course.isPublishedOrScheduled) { @@ -13,6 +35,6 @@ export default class CoursesListItemComponent extends Component { } else if (this.args.course.hasMany('descendants').ids().length > 0) { return false; } - return this.canDeletePermission; + return this.canDeleteData.isResolved ? this.canDeleteData.value : false; } } diff --git a/packages/frontend/app/components/courses/root.hbs b/packages/frontend/app/components/courses/root.hbs index 6114c1ed88..9baa9b547d 100644 --- a/packages/frontend/app/components/courses/root.hbs +++ b/packages/frontend/app/components/courses/root.hbs @@ -56,7 +56,7 @@ ({{this.filteredCourses.length}})
- {{#if this.canCreateCourse}} + {{#if this.canCreate}} ['canCreateCourse', this.selectedSchool]); + @cached + get canCreateData() { + return new TrackedAsyncData( + this.selectedSchool + ? this.permissionChecker.canCreateCourse(this.selectedSchool) + : new Promise((resolve) => { + resolve(() => false); + }), + ); + } + + get canCreate() { + return this.canCreateData.isResolved ? this.canCreateData.value : false; + } get hasMoreThanOneSchool() { return this.args.schools.length > 1; diff --git a/packages/frontend/app/components/curriculum-inventory/report-list-item.js b/packages/frontend/app/components/curriculum-inventory/report-list-item.js index eaa1c2a89b..5b6c99f5dd 100644 --- a/packages/frontend/app/components/curriculum-inventory/report-list-item.js +++ b/packages/frontend/app/components/curriculum-inventory/report-list-item.js @@ -2,8 +2,6 @@ import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; import { TrackedAsyncData } from 'ember-async-data'; import { cached } from '@glimmer/tracking'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; -import { use } from 'ember-could-get-used-to-this'; import { service } from '@ember/service'; export default class CurriculumInventoryReportListItemComponent extends Component { @@ -15,10 +13,16 @@ export default class CurriculumInventoryReportListItemComponent extends Componen this.iliosConfig.itemFromConfig('academicYearCrossesCalendarYearBoundaries'), ); - @use canDelete = new PermissionChecker(() => [ - 'canDeleteCurriculumInventoryReport', - this.args.report, - ]); + @cached + get canDeleteData() { + return new TrackedAsyncData( + this.permissionChecker.canDeleteCurriculumInventoryReport(this.args.report), + ); + } + + get canDelete() { + return this.canDeleteData.isResolved ? this.canDeleteData.value : false; + } @cached get academicYearCrossesCalendarYearBoundaries() { diff --git a/packages/frontend/app/components/instructor-groups/list-item.js b/packages/frontend/app/components/instructor-groups/list-item.js index 9a934815a2..fa8c521b37 100644 --- a/packages/frontend/app/components/instructor-groups/list-item.js +++ b/packages/frontend/app/components/instructor-groups/list-item.js @@ -1,18 +1,19 @@ import Component from '@glimmer/component'; -import { tracked } from '@glimmer/tracking'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; -import { use } from 'ember-could-get-used-to-this'; +import { cached, tracked } from '@glimmer/tracking'; +import { service } from '@ember/service'; import { dropTask } from 'ember-concurrency'; import { TrackedAsyncData } from 'ember-async-data'; -import { cached } from '@glimmer/tracking'; export default class InstructorGroupsListItemComponent extends Component { + @service permissionChecker; @tracked showRemoveConfirmation = false; - @use canDeletePermission = new PermissionChecker(() => [ - 'canDeleteInstructorGroup', - this.args.instructorGroup, - ]); + @cached + get canDeleteData() { + return new TrackedAsyncData( + this.permissionChecker.canDeleteInstructorGroup(this.args.instructorGroup), + ); + } @cached get coursesData() { @@ -24,7 +25,9 @@ export default class InstructorGroupsListItemComponent extends Component { } get canDelete() { - return this.canDeletePermission && this.courses && this.courses.length === 0; + return this.canDeleteData.isResolved + ? this.canDeleteData.value && this.courses && this.courses.length === 0 + : false; } remove = dropTask(async () => { diff --git a/packages/frontend/app/components/instructor-groups/root.js b/packages/frontend/app/components/instructor-groups/root.js index 1c7b83cdfe..bb2459ded4 100644 --- a/packages/frontend/app/components/instructor-groups/root.js +++ b/packages/frontend/app/components/instructor-groups/root.js @@ -1,17 +1,15 @@ import Component from '@glimmer/component'; import { service } from '@ember/service'; -import { tracked } from '@glimmer/tracking'; -import { use } from 'ember-could-get-used-to-this'; +import { cached, tracked } from '@glimmer/tracking'; import { TrackedAsyncData } from 'ember-async-data'; -import { cached } from '@glimmer/tracking'; import { findById } from 'ilios-common/utils/array-helpers'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; import { dropTask } from 'ember-concurrency'; export default class InstructorGroupsRootComponent extends Component { @service currentUser; @service store; @service dataLoader; + @service permissionChecker; @tracked showNewInstructorGroupForm = false; @tracked newInstructorGroup; @tracked instructorGroupPromises = new Map(); @@ -22,16 +20,26 @@ export default class InstructorGroupsRootComponent extends Component { return this.userModel.isResolved ? this.userModel.value : null; } - @use canCreate = new PermissionChecker(() => [ - 'canCreateInstructorGroup', - this.bestSelectedSchool, - ]); + @cached + get canCreateData() { + return new TrackedAsyncData( + this.bestSelectedSchool + ? this.permissionChecker.canCreateInstructorGroup(this.bestSelectedSchool) + : new Promise((resolve) => { + resolve(() => false); + }), + ); + } @cached get loadedSchoolData() { return new TrackedAsyncData(this.getSchoolPromise(this.bestSelectedSchool.id)); } + get canCreate() { + return this.canCreateData.isResolved ? this.canCreateData.value : false; + } + get loadedSchool() { return this.loadedSchoolData.isResolved ? this.loadedSchoolData.value : null; } diff --git a/packages/frontend/app/components/learner-group/list-item.js b/packages/frontend/app/components/learner-group/list-item.js index 2b4d0b81e2..2c3fb84d17 100644 --- a/packages/frontend/app/components/learner-group/list-item.js +++ b/packages/frontend/app/components/learner-group/list-item.js @@ -1,17 +1,35 @@ import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; import { action } from '@ember/object'; -import { use } from 'ember-could-get-used-to-this'; import { dropTask } from 'ember-concurrency'; import { all, filter } from 'rsvp'; import { TrackedAsyncData } from 'ember-async-data'; import { cached } from '@glimmer/tracking'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; +import { service } from '@ember/service'; export default class LearnerGroupListItemComponent extends Component { + @service permissionChecker; @tracked showRemoveConfirmation = false; @tracked showCopyConfirmation = false; + @cached + get canDeleteData() { + return new TrackedAsyncData( + this.permissionChecker.canDeleteLearnerGroup(this.args.learnerGroup), + ); + } + + @cached + get canCreateData() { + return new TrackedAsyncData( + this.school + ? this.permissionChecker.canCreateLearnerGroup(this.school) + : new Promise((resolve) => { + resolve(() => false); + }), + ); + } + @cached get schoolData() { return new TrackedAsyncData(this.getSchool(this.args.learnerGroup)); @@ -26,13 +44,6 @@ export default class LearnerGroupListItemComponent extends Component { return this.schoolData.isResolved ? this.schoolData.value : null; } - @use canDeletePermission = new PermissionChecker(() => [ - 'canDeleteLearnerGroup', - this.args.learnerGroup, - ]); - - @use canCreatePermission = new PermissionChecker(() => ['canCreateLearnerGroup', this.school]); - @cached get isLinked() { return this.isLinkedData.isResolved ? this.isLinkedData.value : null; @@ -42,11 +53,11 @@ export default class LearnerGroupListItemComponent extends Component { if (this.isLinked) { return false; } - return this.canDeletePermission && !this.isLinked; + return this.canDeleteData.isResolved ? this.canDeleteData.value && !this.isLinked : false; } get canCreate() { - return this.school && this.canCreatePermission; + return this.canCreateData.isResolved ? this.canCreateData.value && this.school : false; } async getSchool(learnerGroup) { diff --git a/packages/frontend/app/components/learner-groups/root.js b/packages/frontend/app/components/learner-groups/root.js index 386c43ed2f..b5ea5219ea 100644 --- a/packages/frontend/app/components/learner-groups/root.js +++ b/packages/frontend/app/components/learner-groups/root.js @@ -1,11 +1,8 @@ import Component from '@glimmer/component'; import { service } from '@ember/service'; -import { tracked } from '@glimmer/tracking'; -import { use } from 'ember-could-get-used-to-this'; +import { cached, tracked } from '@glimmer/tracking'; import { TrackedAsyncData } from 'ember-async-data'; -import { cached } from '@glimmer/tracking'; import { findById, sortBy } from 'ilios-common/utils/array-helpers'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; import cloneLearnerGroup from 'frontend/utils/clone-learner-group'; import { dropTask } from 'ember-concurrency'; import { map } from 'rsvp'; @@ -16,6 +13,7 @@ export default class LearnerGroupsRootComponent extends Component { @service store; @service dataLoader; @service intl; + @service permissionChecker; @tracked showNewLearnerGroupForm = false; @tracked savedLearnerGroup; @tracked totalGroupsToSave; @@ -23,7 +21,17 @@ export default class LearnerGroupsRootComponent extends Component { learnerGroupPromises = new Map(); userModel = new TrackedAsyncData(this.currentUser.getModel()); - @use canCreate = new PermissionChecker(() => ['canCreateLearnerGroup', this.selectedSchool]); + + @cached + get canCreateData() { + return new TrackedAsyncData( + this.selectedSchool + ? this.permissionChecker.canCreateLearnerGroup(this.selectedSchool) + : new Promise((resolve) => { + resolve(() => false); + }), + ); + } @cached get user() { @@ -35,6 +43,10 @@ export default class LearnerGroupsRootComponent extends Component { return new TrackedAsyncData(this.selectedSchool.programs); } + get canCreate() { + return this.canCreateData.isResolved ? this.canCreateData.value : false; + } + get programs() { return this.programsData.isResolved ? this.programsData.value : null; } diff --git a/packages/frontend/app/components/program-year/list-item.js b/packages/frontend/app/components/program-year/list-item.js index 402e2069ba..902432ebdf 100644 --- a/packages/frontend/app/components/program-year/list-item.js +++ b/packages/frontend/app/components/program-year/list-item.js @@ -1,9 +1,6 @@ import Component from '@glimmer/component'; -import { tracked } from '@glimmer/tracking'; +import { cached, tracked } from '@glimmer/tracking'; import { TrackedAsyncData } from 'ember-async-data'; -import { cached } from '@glimmer/tracking'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; -import { use } from 'ember-could-get-used-to-this'; import { service } from '@ember/service'; import { dropTask } from 'ember-concurrency'; @@ -13,6 +10,21 @@ export default class ProgramYearListItemComponent extends Component { @tracked showRemoveConfirmation = false; + @cached + get canLockData() { + return new TrackedAsyncData(this.permissionChecker.canLockProgramYear(this.args.programYear)); + } + + @cached + get canUnlockData() { + return new TrackedAsyncData(this.permissionChecker.canUnlockProgramYear(this.args.programYear)); + } + + @cached + get canDeleteData() { + return new TrackedAsyncData(this.permissionChecker.canDeleteProgramYear(this.args.programYear)); + } + @cached get programData() { return new TrackedAsyncData(this.args.programYear.program); @@ -31,12 +43,13 @@ export default class ProgramYearListItemComponent extends Component { return this.cohortData.isResolved ? this.cohortData.value : null; } - @use canDeletePermission = new PermissionChecker(() => [ - 'canDeleteProgramYear', - this.args.programYear, - ]); - @use canLock = new PermissionChecker(() => ['canLockProgramYear', this.args.programYear]); - @use canUnlock = new PermissionChecker(() => ['canUnlockProgramYear', this.args.programYear]); + get canLock() { + return this.canLockData.isResolved ? this.canLockData.value : false; + } + + get canUnlock() { + return this.canUnlockData.isResolved ? this.canUnlockData.value : false; + } get canDelete() { if (!this.cohort) { @@ -48,7 +61,7 @@ export default class ProgramYearListItemComponent extends Component { return false; } - return this.canDeletePermission; + return this.canDeleteData.isResolved ? this.canDeleteData.value : false; } get classOfYear() { diff --git a/packages/frontend/app/components/programs/list-item.js b/packages/frontend/app/components/programs/list-item.js index 4e1ed71523..604beee8b8 100644 --- a/packages/frontend/app/components/programs/list-item.js +++ b/packages/frontend/app/components/programs/list-item.js @@ -1,19 +1,25 @@ import Component from '@glimmer/component'; -import { tracked } from '@glimmer/tracking'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; -import { use } from 'ember-could-get-used-to-this'; +import { cached, tracked } from '@glimmer/tracking'; +import { service } from '@ember/service'; import { dropTask } from 'ember-concurrency'; +import { TrackedAsyncData } from 'ember-async-data'; export default class ProgramListItemComponent extends Component { + @service permissionChecker; @tracked showRemoveConfirmation = false; - @use canDeletePermission = new PermissionChecker(() => ['canDeleteProgram', this.args.program]); + @cached + get canDeleteData() { + return new TrackedAsyncData(this.permissionChecker.canDeleteProgram(this.args.program)); + } get canDelete() { const hasCiReports = this.args.program.hasMany('curriculumInventoryReports').ids().length > 0; const hasProgramYears = this.args.program.hasMany('programYears').ids().length > 0; - return this.canDeletePermission && !hasCiReports && !hasProgramYears; + return this.canDeleteData.isResolved + ? this.canDeleteData.value && !hasCiReports && !hasProgramYears + : false; } remove = dropTask(async () => { diff --git a/packages/frontend/app/components/programs/root.js b/packages/frontend/app/components/programs/root.js index 3be849c2a3..8c784b56af 100644 --- a/packages/frontend/app/components/programs/root.js +++ b/packages/frontend/app/components/programs/root.js @@ -1,15 +1,13 @@ import Component from '@glimmer/component'; import { service } from '@ember/service'; -import { tracked } from '@glimmer/tracking'; -import { use } from 'ember-could-get-used-to-this'; +import { cached, tracked } from '@glimmer/tracking'; import { TrackedAsyncData } from 'ember-async-data'; -import { cached } from '@glimmer/tracking'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; import { findById } from 'ilios-common/utils/array-helpers'; import { dropTask } from 'ember-concurrency'; export default class ProgramRootComponent extends Component { @service currentUser; + @service permissionChecker; @tracked selectedSchoolId; @tracked showNewProgramForm = false; @tracked newProgram; @@ -20,13 +18,26 @@ export default class ProgramRootComponent extends Component { return this.userModel.isResolved ? this.userModel.value : null; } - @use canCreate = new PermissionChecker(() => ['canCreateProgram', this.bestSelectedSchool]); + @cached + get canCreateData() { + return new TrackedAsyncData( + this.bestSelectedSchool + ? this.permissionChecker.canCreateProgram(this.bestSelectedSchool) + : new Promise((resolve) => { + resolve(() => false); + }), + ); + } @cached get programsData() { return new TrackedAsyncData(this.bestSelectedSchool.programs); } + get canCreate() { + return this.canCreateData.isResolved ? this.canCreateData.value : false; + } + get programs() { return this.programsData.isResolved ? this.programsData.value : []; } diff --git a/packages/frontend/app/controllers/learner-group.js b/packages/frontend/app/controllers/learner-group.js index 376a116df0..1c79d13375 100644 --- a/packages/frontend/app/controllers/learner-group.js +++ b/packages/frontend/app/controllers/learner-group.js @@ -1,7 +1,5 @@ import Controller from '@ember/controller'; import { tracked } from '@glimmer/tracking'; -import { use } from 'ember-could-get-used-to-this'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; import { TrackedAsyncData } from 'ember-async-data'; import { cached } from '@glimmer/tracking'; import { service } from '@ember/service'; @@ -14,8 +12,23 @@ export default class LearnerGroupController extends Controller { @tracked isBulkAssigning = false; @tracked sortUsersBy = 'fullName'; - @use canUpdate = new PermissionChecker(() => ['canUpdateLearnerGroup', this.model]); - @use canDelete = new PermissionChecker(() => ['canDeleteLearnerGroup', this.model]); + @cached + get canDeleteData() { + return new TrackedAsyncData(this.permissionChecker.canDeleteLearnerGroup(this.model)); + } + + get canDelete() { + return this.canDeleteData.isResolved ? this.canDeleteData.value : false; + } + + @cached + get canUpdateData() { + return new TrackedAsyncData(this.permissionChecker.canUpdateLearnerGroup(this.model)); + } + + get canUpdate() { + return this.canUpdateData.isResolved ? this.canUpdateData.value : false; + } @cached get canCreateData() { diff --git a/packages/frontend/app/controllers/user.js b/packages/frontend/app/controllers/user.js index d83507a798..a7f704dd7d 100644 --- a/packages/frontend/app/controllers/user.js +++ b/packages/frontend/app/controllers/user.js @@ -6,7 +6,6 @@ import { use } from 'ember-could-get-used-to-this'; import AsyncProcess from 'ilios-common/classes/async-process'; import { TrackedAsyncData } from 'ember-async-data'; import { cached } from '@glimmer/tracking'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; export default class UserController extends Controller { @service store; @@ -30,9 +29,17 @@ export default class UserController extends Controller { @tracked permissionsSchool = null; @tracked permissionsYear = null; - @use canUpdate = new PermissionChecker(() => ['canUpdateUser', this.model]); @use canCreate = new AsyncProcess(() => [this.canCreateInSomeSchool.bind(this), this.allSchools]); + @cached + get canUpdateData() { + return new TrackedAsyncData(this.permissionChecker.canUpdateUser(this.model)); + } + + get canUpdate() { + return this.canUpdateData.isResolved ? this.canUpdateData.value : false; + } + @cached get allSchoolsData() { return new TrackedAsyncData(this.store.findAll('school')); diff --git a/packages/ilios-common/.lint-todo b/packages/ilios-common/.lint-todo index 2107648306..e4bec4d7dd 100644 --- a/packages/ilios-common/.lint-todo +++ b/packages/ilios-common/.lint-todo @@ -95,3 +95,6 @@ add|ember-template-lint|no-at-ember-render-modifiers|3|2|3|2|1fb6f249958ee245e6a add|ember-template-lint|no-at-ember-render-modifiers|4|2|4|2|856162ce473b112534763bb641aae7a4422d8e2e|1712102400000|1714694400000|1717286400000|addon/components/session/postrequisite-editor.hbs add|ember-template-lint|no-at-ember-render-modifiers|28|6|28|6|242be4337ef58ba487a9168fe2944bd6919a1397|1712102400000|1714694400000|1717286400000|addon/components/session/publication-menu.hbs add|ember-template-lint|no-at-ember-render-modifiers|29|6|29|6|df94e6558ff62dea69f6f656f668f29b56bcc378|1712102400000|1714694400000|1717286400000|addon/components/session/publication-menu.hbs +remove|ember-template-lint|no-at-ember-render-modifiers|36|10|36|10|896990d580c1ce62f1484f4d4d8a77c1e90e77b4|1712102400000|1714694400000|1717286400000|addon/components/detail-taxonomies.hbs +remove|ember-template-lint|no-at-ember-render-modifiers|4|34|4|34|896990d580c1ce62f1484f4d4d8a77c1e90e77b4|1712102400000|1714694400000|1717286400000|addon/components/new-offering.hbs +remove|ember-template-lint|no-at-ember-render-modifiers|4|2|4|2|8d238303df63c3e74b1cfcb72bf9288f0418b631|1712102400000|1714694400000|1717286400000|addon/components/week-glance.hbs diff --git a/packages/ilios-common/addon/components/sessions-grid-offering-table.js b/packages/ilios-common/addon/components/sessions-grid-offering-table.js index 707cd22e1b..4560cda45f 100644 --- a/packages/ilios-common/addon/components/sessions-grid-offering-table.js +++ b/packages/ilios-common/addon/components/sessions-grid-offering-table.js @@ -1,13 +1,21 @@ import Component from '@glimmer/component'; -import { use } from 'ember-could-get-used-to-this'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; -import { TrackedAsyncData } from 'ember-async-data'; import { cached } from '@glimmer/tracking'; +import { service } from '@ember/service'; +import { TrackedAsyncData } from 'ember-async-data'; import OfferingDateBlock from 'ilios-common/utils/offering-date-block'; import { sortBy } from 'ilios-common/utils/array-helpers'; export default class SessionsGridOfferingTable extends Component { - @use canUpdate = new PermissionChecker(() => ['canUpdateSession', this.args.session]); + @service permissionChecker; + + @cached + get canUpdateData() { + return new TrackedAsyncData(this.permissionChecker.canUpdateSession(this.args.session)); + } + + get canUpdate() { + return this.canUpdateData.isResolved ? this.canUpdateData.value : false; + } @cached get offerings() { diff --git a/packages/ilios-common/addon/components/sessions-grid-row.js b/packages/ilios-common/addon/components/sessions-grid-row.js index b4f6206deb..b6ec556d8d 100644 --- a/packages/ilios-common/addon/components/sessions-grid-row.js +++ b/packages/ilios-common/addon/components/sessions-grid-row.js @@ -1,8 +1,26 @@ import Component from '@glimmer/component'; -import { use } from 'ember-could-get-used-to-this'; -import PermissionChecker from 'ilios-common/classes/permission-checker'; +import { cached } from '@glimmer/tracking'; +import { service } from '@ember/service'; +import { TrackedAsyncData } from 'ember-async-data'; export default class SessionsGridRowComponent extends Component { - @use canDelete = new PermissionChecker(() => ['canDeleteSession', this.args.session]); - @use canUpdate = new PermissionChecker(() => ['canUpdateSession', this.args.session]); + @service permissionChecker; + + @cached + get canDeleteData() { + return new TrackedAsyncData(this.permissionChecker.canDeleteSession(this.args.session)); + } + + get canDelete() { + return this.canDeleteData.isResolved ? this.canDeleteData.value : false; + } + + @cached + get canUpdateData() { + return new TrackedAsyncData(this.permissionChecker.canUpdateSession(this.args.session)); + } + + get canUpdate() { + return this.canUpdateData.isResolved ? this.canUpdateData.value : false; + } } diff --git a/packages/test-app/tests/integration/components/sessions-grid-offering-table-test.js b/packages/test-app/tests/integration/components/sessions-grid-offering-table-test.js index 8a7ee716df..8a6f90d1af 100644 --- a/packages/test-app/tests/integration/components/sessions-grid-offering-table-test.js +++ b/packages/test-app/tests/integration/components/sessions-grid-offering-table-test.js @@ -16,16 +16,12 @@ module('Integration | Component | sessions-grid-offering-table', function (hooks setupIntl(hooks, 'en-us'); setupMirage(hooks); test('it renders', async function (assert) { - class PermissionCheckerStub extends Service { - canDeleteSession() { - return true; - } - canUpdateSession() { + class PermissionCheckerServiceMock extends Service { + async canUpdateSession() { return true; } } - - this.owner.register('service:permissionChecker', PermissionCheckerStub); + this.owner.register('service:permission-checker', PermissionCheckerServiceMock); const session = this.server.create('session'); this.server.createList('offering', 3, { session, diff --git a/packages/test-app/tests/integration/components/sessions-grid-row-test.js b/packages/test-app/tests/integration/components/sessions-grid-row-test.js index 8b17949aa6..88f5bfa1ff 100644 --- a/packages/test-app/tests/integration/components/sessions-grid-row-test.js +++ b/packages/test-app/tests/integration/components/sessions-grid-row-test.js @@ -3,8 +3,8 @@ import { setupRenderingTest } from 'test-app/tests/helpers'; import { setupIntl } from 'ember-intl/test-support'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { DateTime } from 'luxon'; -import Service from '@ember/service'; import { render } from '@ember/test-helpers'; +import Service from '@ember/service'; import { hbs } from 'ember-cli-htmlbars'; import { component } from 'ilios-common/page-objects/components/sessions-grid-row'; @@ -13,18 +13,6 @@ module('Integration | Component | sessions-grid-row', function (hooks) { setupIntl(hooks, 'en-us'); setupMirage(hooks); - hooks.beforeEach(function () { - class PermissionCheckerStub extends Service { - canDeleteSession() { - return true; - } - canUpdateSession() { - return true; - } - } - this.owner.register('service:permissionChecker', PermissionCheckerStub); - }); - test('it renders', async function (assert) { const date = DateTime.fromObject({ year: 2019, month: 7, day: 9, hour: 17 }); const session = this.server.create('session'); @@ -90,6 +78,15 @@ module('Integration | Component | sessions-grid-row', function (hooks) { test('confirmDelete fires', async function (assert) { assert.expect(1); + class PermissionCheckerServiceMock extends Service { + async canDeleteSession() { + return true; + } + async canUpdateSession() { + return true; + } + } + this.owner.register('service:permission-checker', PermissionCheckerServiceMock); const session = this.server.create('session'); const model = await this.owner.lookup('service:store').findRecord('session', session.id); this.set('session', model); From 043f64d99efee41ffb4bef712d8ac3049442c9f9 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 4 Apr 2024 14:18:40 -0700 Subject: [PATCH 2/4] rm obsolete permission checker class. --- .../addon/classes/permission-checker.js | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 packages/ilios-common/addon/classes/permission-checker.js diff --git a/packages/ilios-common/addon/classes/permission-checker.js b/packages/ilios-common/addon/classes/permission-checker.js deleted file mode 100644 index 455906884c..0000000000 --- a/packages/ilios-common/addon/classes/permission-checker.js +++ /dev/null @@ -1,18 +0,0 @@ -import { tracked } from '@glimmer/tracking'; -import { service } from '@ember/service'; -import { Resource } from 'ember-could-get-used-to-this'; - -export default class PermissionCheckerResource extends Resource { - @service permissionChecker; - @tracked data; - - get value() { - return this.data; - } - - async setup() { - const fnName = this.args.positional[0]; - //pass any remaining arguments directly to the processor function - this.data = await this.permissionChecker[fnName](...this.args.positional.slice(1)); - } -} From 1177f0fb817a36932256004837bc3c9921720c8e Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Fri, 5 Apr 2024 10:07:24 -0700 Subject: [PATCH 3/4] replace unneccessary Promise with just FALSE. --- packages/frontend/app/components/courses/root.js | 6 +----- packages/frontend/app/components/instructor-groups/root.js | 4 +--- packages/frontend/app/components/learner-group/list-item.js | 6 +----- packages/frontend/app/components/learner-groups/root.js | 4 +--- packages/frontend/app/components/programs/root.js | 4 +--- 5 files changed, 5 insertions(+), 19 deletions(-) diff --git a/packages/frontend/app/components/courses/root.js b/packages/frontend/app/components/courses/root.js index cd06ba25a0..5a9a60d4b3 100644 --- a/packages/frontend/app/components/courses/root.js +++ b/packages/frontend/app/components/courses/root.js @@ -65,11 +65,7 @@ export default class CoursesRootComponent extends Component { @cached get canCreateData() { return new TrackedAsyncData( - this.selectedSchool - ? this.permissionChecker.canCreateCourse(this.selectedSchool) - : new Promise((resolve) => { - resolve(() => false); - }), + this.selectedSchool ? this.permissionChecker.canCreateCourse(this.selectedSchool) : false, ); } diff --git a/packages/frontend/app/components/instructor-groups/root.js b/packages/frontend/app/components/instructor-groups/root.js index bb2459ded4..362d073117 100644 --- a/packages/frontend/app/components/instructor-groups/root.js +++ b/packages/frontend/app/components/instructor-groups/root.js @@ -25,9 +25,7 @@ export default class InstructorGroupsRootComponent extends Component { return new TrackedAsyncData( this.bestSelectedSchool ? this.permissionChecker.canCreateInstructorGroup(this.bestSelectedSchool) - : new Promise((resolve) => { - resolve(() => false); - }), + : false, ); } diff --git a/packages/frontend/app/components/learner-group/list-item.js b/packages/frontend/app/components/learner-group/list-item.js index 2c3fb84d17..cf7bdf8f79 100644 --- a/packages/frontend/app/components/learner-group/list-item.js +++ b/packages/frontend/app/components/learner-group/list-item.js @@ -22,11 +22,7 @@ export default class LearnerGroupListItemComponent extends Component { @cached get canCreateData() { return new TrackedAsyncData( - this.school - ? this.permissionChecker.canCreateLearnerGroup(this.school) - : new Promise((resolve) => { - resolve(() => false); - }), + this.school ? this.permissionChecker.canCreateLearnerGroup(this.school) : false, ); } diff --git a/packages/frontend/app/components/learner-groups/root.js b/packages/frontend/app/components/learner-groups/root.js index b5ea5219ea..ae3cc4b73f 100644 --- a/packages/frontend/app/components/learner-groups/root.js +++ b/packages/frontend/app/components/learner-groups/root.js @@ -27,9 +27,7 @@ export default class LearnerGroupsRootComponent extends Component { return new TrackedAsyncData( this.selectedSchool ? this.permissionChecker.canCreateLearnerGroup(this.selectedSchool) - : new Promise((resolve) => { - resolve(() => false); - }), + : false, ); } diff --git a/packages/frontend/app/components/programs/root.js b/packages/frontend/app/components/programs/root.js index 8c784b56af..e8ed02a3d8 100644 --- a/packages/frontend/app/components/programs/root.js +++ b/packages/frontend/app/components/programs/root.js @@ -23,9 +23,7 @@ export default class ProgramRootComponent extends Component { return new TrackedAsyncData( this.bestSelectedSchool ? this.permissionChecker.canCreateProgram(this.bestSelectedSchool) - : new Promise((resolve) => { - resolve(() => false); - }), + : false, ); } From e1094b0c07da28fea6fafcdca9da76c89f44eb74 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Fri, 5 Apr 2024 10:08:58 -0700 Subject: [PATCH 4/4] clean up lint todo list. --- packages/ilios-common/.lint-todo | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/ilios-common/.lint-todo b/packages/ilios-common/.lint-todo index e4bec4d7dd..2107648306 100644 --- a/packages/ilios-common/.lint-todo +++ b/packages/ilios-common/.lint-todo @@ -95,6 +95,3 @@ add|ember-template-lint|no-at-ember-render-modifiers|3|2|3|2|1fb6f249958ee245e6a add|ember-template-lint|no-at-ember-render-modifiers|4|2|4|2|856162ce473b112534763bb641aae7a4422d8e2e|1712102400000|1714694400000|1717286400000|addon/components/session/postrequisite-editor.hbs add|ember-template-lint|no-at-ember-render-modifiers|28|6|28|6|242be4337ef58ba487a9168fe2944bd6919a1397|1712102400000|1714694400000|1717286400000|addon/components/session/publication-menu.hbs add|ember-template-lint|no-at-ember-render-modifiers|29|6|29|6|df94e6558ff62dea69f6f656f668f29b56bcc378|1712102400000|1714694400000|1717286400000|addon/components/session/publication-menu.hbs -remove|ember-template-lint|no-at-ember-render-modifiers|36|10|36|10|896990d580c1ce62f1484f4d4d8a77c1e90e77b4|1712102400000|1714694400000|1717286400000|addon/components/detail-taxonomies.hbs -remove|ember-template-lint|no-at-ember-render-modifiers|4|34|4|34|896990d580c1ce62f1484f4d4d8a77c1e90e77b4|1712102400000|1714694400000|1717286400000|addon/components/new-offering.hbs -remove|ember-template-lint|no-at-ember-render-modifiers|4|2|4|2|8d238303df63c3e74b1cfcb72bf9288f0418b631|1712102400000|1714694400000|1717286400000|addon/components/week-glance.hbs