diff --git a/src/app/features/contributors/contributors.component.html b/src/app/features/contributors/contributors.component.html index ac9824f2a..dd3d74d45 100644 --- a/src/app/features/contributors/contributors.component.html +++ b/src/app/features/contributors/contributors.component.html @@ -96,7 +96,7 @@

{{ 'project.requestAccess.requestForAccess' | translate }}

{ - const payload = { permissions: contributor.permission }; + const payload = { permissions: requestAccessItem.requestedPermissions }; this.actions - .acceptRequestAccess(contributor.id, this.resourceId(), this.resourceType(), payload) + .acceptRequestAccess(requestAccessItem.id, this.resourceId(), this.resourceType(), payload) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => this.toastService.showSuccess('project.requestAccess.acceptDialog.successMessage')); }, }); } - rejectRequest(contributor: ContributorModel) { + rejectRequest(requestAccessItem: RequestAccessModel) { this.customConfirmationService.confirmDelete({ headerKey: 'project.requestAccess.rejectDialog.header', messageKey: 'project.requestAccess.rejectDialog.message', - messageParams: { name: contributor.fullName }, + messageParams: { name: requestAccessItem.creator.fullName }, acceptLabelKey: 'common.buttons.reject', onConfirm: () => { this.actions - .rejectRequestAccess(contributor.id, this.resourceId(), this.resourceType()) + .rejectRequestAccess(requestAccessItem.id, this.resourceId(), this.resourceType()) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => this.toastService.showSuccess('project.requestAccess.rejectDialog.successMessage')); }, diff --git a/src/app/features/project/overview/components/toggle-publicity-dialog/toggle-publicity-dialog.component.html b/src/app/features/project/overview/components/toggle-publicity-dialog/toggle-publicity-dialog.component.html index af21f0c1a..97e196d52 100644 --- a/src/app/features/project/overview/components/toggle-publicity-dialog/toggle-publicity-dialog.component.html +++ b/src/app/features/project/overview/components/toggle-publicity-dialog/toggle-publicity-dialog.component.html @@ -11,7 +11,7 @@

{{ 'project.overview.dialog.uncheckedComponents' | translate }}

diff --git a/src/app/shared/components/contributors/contributors-table/contributors-table.component.html b/src/app/shared/components/contributors/contributors-table/contributors-table.component.html index 64aaf6009..7d8bf2789 100644 --- a/src/app/shared/components/contributors/contributors-table/contributors-table.component.html +++ b/src/app/shared/components/contributors/contributors-table/contributors-table.component.html @@ -112,7 +112,7 @@ binary="true" [(ngModel)]="contributor.isBibliographic" [ariaLabel]="'project.contributors.table.headers.contributor' | translate" - [disabled]="!hasAdminAccess() || contributor.deactivated" + [disabled]="!hasAdminAccess() || contributor.deactivated || contributor.isCurator" > diff --git a/src/app/shared/components/contributors/request-access-table/request-access-table.component.html b/src/app/shared/components/contributors/request-access-table/request-access-table.component.html index dfaa199a6..ca9a8bab2 100644 --- a/src/app/shared/components/contributors/request-access-table/request-access-table.component.html +++ b/src/app/shared/components/contributors/request-access-table/request-access-table.component.html @@ -1,4 +1,4 @@ - + {{ 'project.contributors.table.headers.name' | translate }} @@ -46,7 +46,7 @@

- {{ contributor.fullName }} + {{ contributor.creator.fullName }}

@@ -57,7 +57,7 @@ [appendTo]="'body'" [noBorder]="true" [fullWidth]="true" - [(selectedValue)]="contributor.permission" + [(selectedValue)]="contributor.requestedPermissions" /> @@ -68,7 +68,7 @@ binary="true" [(ngModel)]="contributor.isBibliographic" [ariaLabel]="'project.contributors.table.headers.contributor' | translate" - [disabled]="contributor.deactivated" + [disabled]="contributor.isCurator" > @@ -85,7 +85,7 @@ @if (showEmployment()) { - @if (contributor.employment?.length) { + @if (contributor.creator.employment?.length) {
- @if (contributor.education?.length) { + @if (contributor.creator.education?.length) { (); + requestAccessList = input.required(); isLoading = input(false); resourceType = input(ResourceType.Project); showEmployment = input(true); showEducation = input(true); showInfo = input(true); - accept = output(); - reject = output(); + accept = output(); + reject = output(); customDialogService = inject(CustomDialogService); readonly permissionsOptions: SelectOption[] = PERMISSION_OPTIONS; - skeletonData: ContributorModel[] = Array.from({ length: 3 }, () => ({}) as ContributorModel); + skeletonData = Array.from({ length: 3 }, () => ({}) as RequestAccessModel); isProject = computed(() => this.resourceType() === ResourceType.Project); - acceptContributor(contributor: ContributorModel) { - this.accept.emit(contributor); + acceptContributor(requestAccessItem: RequestAccessModel) { + this.accept.emit(requestAccessItem); } - rejectContributor(contributor: ContributorModel) { - this.reject.emit(contributor); + rejectContributor(requestAccessItem: RequestAccessModel) { + this.reject.emit(requestAccessItem); } - openEducationHistory(contributor: ContributorModel) { + openEducationHistory(requestAccessItem: RequestAccessModel) { this.customDialogService.open(EducationHistoryDialogComponent, { header: 'project.contributors.table.headers.education', width: '552px', - data: contributor.education, + data: requestAccessItem.creator.education, }); } - openEmploymentHistory(contributor: ContributorModel) { + openEmploymentHistory(requestAccessItem: RequestAccessModel) { this.customDialogService.open(EmploymentHistoryDialogComponent, { header: 'project.contributors.table.headers.employment', width: '552px', - data: contributor.employment, + data: requestAccessItem.creator.employment, }); } } diff --git a/src/app/shared/enums/index.ts b/src/app/shared/enums/index.ts index 196709f99..4fc762597 100644 --- a/src/app/shared/enums/index.ts +++ b/src/app/shared/enums/index.ts @@ -27,6 +27,7 @@ export * from './registration-review-states.enum'; export * from './registry-resource.enum'; export * from './registry-status.enum'; export * from './request-access-trigger.enum'; +export * from './request-access-type.enum'; export * from './resource-search-mode.enum'; export * from './resource-type.enum'; export * from './reusable-filter-type.enum'; diff --git a/src/app/shared/enums/request-access-type.enum.ts b/src/app/shared/enums/request-access-type.enum.ts new file mode 100644 index 000000000..c471f9590 --- /dev/null +++ b/src/app/shared/enums/request-access-type.enum.ts @@ -0,0 +1,4 @@ +export enum RequestAccessType { + InstitutionalRequest = 'institutional_request', + Access = 'access', +} diff --git a/src/app/shared/mappers/request-access/request-access.mapper.ts b/src/app/shared/mappers/request-access/request-access.mapper.ts index ec6fe2bb6..232ff1e51 100644 --- a/src/app/shared/mappers/request-access/request-access.mapper.ts +++ b/src/app/shared/mappers/request-access/request-access.mapper.ts @@ -1,10 +1,5 @@ -import { ContributorPermission, RequestAccessTrigger } from '@osf/shared/enums'; -import { - ContributorModel, - RequestAccessDataJsonApi, - RequestAccessModel, - RequestAccessPayload, -} from '@osf/shared/models'; +import { ContributorPermission, RequestAccessTrigger, RequestAccessType } from '@osf/shared/enums'; +import { RequestAccessDataJsonApi, RequestAccessModel, RequestAccessPayload } from '@osf/shared/models'; import { UserMapper } from '../user'; @@ -28,34 +23,10 @@ export class RequestAccessMapper { created: attributes.created, modified: attributes.modified, dateLastTransitioned: attributes.date_last_transitioned, - requestedPermissions: attributes.requested_permissions, + requestedPermissions: attributes.requested_permissions || ContributorPermission.Read, creator: UserMapper.fromUserGetResponse(data.embeds.creator.data), - }; - } - - static convertToContributorModels(data: RequestAccessDataJsonApi[]): ContributorModel[] { - return data.map((item, index) => this.convertToContributorModel(item, index)); - } - - static convertToContributorModel(data: RequestAccessDataJsonApi, index: number): ContributorModel { - const userData = data.embeds.creator.data; - const attributes = data.attributes; - - return { - id: data.id, - type: data.type, - isBibliographic: true, - isUnregisteredContributor: false, - isCurator: false, - permission: attributes.requested_permissions || ContributorPermission.Read, - index: index, - userId: userData.id || '', - fullName: userData?.attributes?.full_name || '', - givenName: userData?.attributes?.given_name || '', - familyName: userData?.attributes?.family_name || '', - education: userData?.attributes?.education || [], - employment: userData?.attributes?.employment || [], - deactivated: false, + isBibliographic: attributes.request_type == RequestAccessType.Access, + isCurator: attributes.request_type === RequestAccessType.InstitutionalRequest, }; } diff --git a/src/app/shared/models/request-access/request-access.model.ts b/src/app/shared/models/request-access/request-access.model.ts index cfabba4a5..46059fe92 100644 --- a/src/app/shared/models/request-access/request-access.model.ts +++ b/src/app/shared/models/request-access/request-access.model.ts @@ -1,3 +1,5 @@ +import { ContributorPermission } from '@osf/shared/enums'; + import { UserModel } from '../user'; export interface RequestAccessModel { @@ -8,6 +10,8 @@ export interface RequestAccessModel { created: string; modified: string; dateLastTransitioned: string; - requestedPermissions: string | null; + requestedPermissions: ContributorPermission; creator: UserModel; + isBibliographic: boolean; + isCurator: boolean; } diff --git a/src/app/shared/services/request-access.service.ts b/src/app/shared/services/request-access.service.ts index effa0ae8f..57a516a1c 100644 --- a/src/app/shared/services/request-access.service.ts +++ b/src/app/shared/services/request-access.service.ts @@ -6,7 +6,7 @@ import { ENVIRONMENT } from '@core/provider/environment.provider'; import { RequestAccessTrigger, ResourceType } from '../enums'; import { RequestAccessMapper } from '../mappers/request-access'; -import { ContributorModel, RequestAccessPayload, RequestAccessResponseJsonApi } from '../models'; +import { RequestAccessModel, RequestAccessPayload, RequestAccessResponseJsonApi } from '../models'; import { JsonApiService } from './json-api.service'; @@ -34,13 +34,13 @@ export class RequestAccessService { return `${this.apiUrl}/${resourcePath}/${resourceId}/requests`; } - getRequestAccessList(resourceType: ResourceType, resourceId: string): Observable { + getRequestAccessList(resourceType: ResourceType, resourceId: string): Observable { const baseUrl = this.getBaseUrl(resourceType, resourceId); const params = { 'embed[]': ['creator'], 'filter[machine_state]': 'pending' }; return this.jsonApiService .get(`${baseUrl}/`, params) - .pipe(map((response) => RequestAccessMapper.convertToContributorModels(response.data))); + .pipe(map((response) => RequestAccessMapper.getRequestAccessList(response.data))); } acceptRequestAccess( diff --git a/src/app/shared/stores/contributors/contributors.model.ts b/src/app/shared/stores/contributors/contributors.model.ts index bea8a0c3d..9584f746f 100644 --- a/src/app/shared/stores/contributors/contributors.model.ts +++ b/src/app/shared/stores/contributors/contributors.model.ts @@ -1,4 +1,4 @@ -import { ContributorAddModel, ContributorModel } from '@osf/shared/models'; +import { ContributorAddModel, ContributorModel, RequestAccessModel } from '@osf/shared/models'; import { AsyncStateModel, AsyncStateWithTotalCount } from '@osf/shared/models/store'; export interface ContributorsStateModel { @@ -7,7 +7,7 @@ export interface ContributorsStateModel { permissionFilter: string | null; bibliographyFilter: boolean | null; }; - requestAccessList: AsyncStateModel; + requestAccessList: AsyncStateModel; users: AsyncStateWithTotalCount; }