Skip to content

Commit 123ae09

Browse files
authored
fix(request-access): added request access list (#564)
1 parent 45031b3 commit 123ae09

30 files changed

+825
-48
lines changed

src/app/core/components/request-access/request-access.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import { FormsModule } from '@angular/forms';
1212
import { ActivatedRoute, Router } from '@angular/router';
1313

1414
import { ENVIRONMENT } from '@core/provider/environment.provider';
15-
import { AuthService, RequestAccessService } from '@osf/core/services';
15+
import { AuthService } from '@core/services';
1616
import { InputLimits } from '@osf/shared/constants';
17-
import { LoaderService, ToastService } from '@osf/shared/services';
17+
import { LoaderService, RequestAccessService, ToastService } from '@osf/shared/services';
1818

1919
@Component({
2020
selector: 'osf-request-access',

src/app/core/services/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export { AuthService } from './auth.service';
2-
export { RequestAccessService } from './request-access.service';
32
export { UserService } from './user.service';
43
export { UserEmailsService } from './user-emails.service';

src/app/core/services/request-access.service.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/app/features/admin-institutions/mappers/send-message-request.mapper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SendMessageRequest } from '@osf/features/admin-institutions/models';
1+
import { SendMessageRequest } from '../models';
22

33
export function sendMessageRequestMapper(request: SendMessageRequest) {
44
return {

src/app/features/project/contributors/contributors.component.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,21 @@ <h1 class="py-5 px-3 md:px-5 xl:px-4">{{ 'navigation.contributors' | translate }
8787
</div>
8888
}
8989

90+
@if (showRequestAccessList()) {
91+
<h1 class="my-4">{{ 'project.requestAccess.requestForAccess' | translate }}</h1>
92+
93+
<p class="mb-4">{{ 'project.requestAccess.followingUsers' | translate }}</p>
94+
95+
<osf-request-access-table
96+
class="w-full"
97+
[contributors]="requestAccessList()"
98+
[isLoading]="areRequestAccessListLoading()"
99+
[resourceType]="resourceType()"
100+
(accept)="acceptRequest($event)"
101+
(reject)="rejectRequest($event)"
102+
></osf-request-access-table>
103+
}
104+
90105
@if (isCurrentUserAdminContributor()) {
91106
<div class="flex flex-column row-gap-4 mt-6 w-full">
92107
<h2>{{ 'project.contributors.viewOnly' | translate }}</h2>

src/app/features/project/contributors/contributors.component.ts

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
AddContributorDialogComponent,
2929
AddUnregisteredContributorDialogComponent,
3030
ContributorsTableComponent,
31+
RequestAccessTableComponent,
3132
} from '@osf/shared/components/contributors';
3233
import { BIBLIOGRAPHY_OPTIONS, PERMISSION_OPTIONS } from '@osf/shared/constants';
3334
import { AddContributorType, ContributorPermission, ResourceType } from '@osf/shared/enums';
@@ -41,6 +42,7 @@ import {
4142
} from '@osf/shared/models';
4243
import { CustomConfirmationService, CustomDialogService, ToastService } from '@osf/shared/services';
4344
import {
45+
AcceptRequestAccess,
4446
AddContributor,
4547
BulkAddContributors,
4648
BulkUpdateContributors,
@@ -51,7 +53,9 @@ import {
5153
DeleteViewOnlyLink,
5254
FetchViewOnlyLinks,
5355
GetAllContributors,
56+
GetRequestAccessContributors,
5457
GetResourceDetails,
58+
RejectRequestAccess,
5559
UpdateBibliographyFilter,
5660
UpdateContributorsSearchValue,
5761
UpdatePermissionFilter,
@@ -71,6 +75,7 @@ import { ResourceInfoModel } from './models';
7175
FormsModule,
7276
TableModule,
7377
ContributorsTableComponent,
78+
RequestAccessTableComponent,
7479
ViewOnlyTableComponent,
7580
],
7681
templateUrl: './contributors.component.html',
@@ -99,9 +104,11 @@ export class ContributorsComponent implements OnInit {
99104
readonly permissionsOptions: SelectOption[] = PERMISSION_OPTIONS;
100105
readonly bibliographyOptions: SelectOption[] = BIBLIOGRAPHY_OPTIONS;
101106

102-
initialContributors = select(ContributorsSelectors.getContributors);
103107
contributors = signal<ContributorModel[]>([]);
104108

109+
readonly initialContributors = select(ContributorsSelectors.getContributors);
110+
readonly requestAccessList = select(ContributorsSelectors.getRequestAccessList);
111+
readonly areRequestAccessListLoading = select(ContributorsSelectors.areRequestAccessListLoading);
105112
readonly isContributorsLoading = select(ContributorsSelectors.isContributorsLoading);
106113
readonly isViewOnlyLinksLoading = select(ViewOnlyLinkSelectors.isViewOnlyLinksLoading);
107114
readonly currentUser = select(UserSelectors.getCurrentUser);
@@ -118,11 +125,19 @@ export class ContributorsComponent implements OnInit {
118125
const initialContributors = this.initialContributors();
119126
if (!currentUserId) return false;
120127

121-
return initialContributors.some((contributor: ContributorModel) => {
122-
return contributor.userId === currentUserId && contributor.permission === ContributorPermission.Admin;
123-
});
128+
return initialContributors.some(
129+
(contributor: ContributorModel) =>
130+
contributor.userId === currentUserId && contributor.permission === ContributorPermission.Admin
131+
);
124132
});
125133

134+
showRequestAccessList = computed(
135+
() =>
136+
this.isCurrentUserAdminContributor() &&
137+
this.requestAccessList().length &&
138+
this.resourceType() === ResourceType.Project
139+
);
140+
126141
actions = createDispatchMap({
127142
getViewOnlyLinks: FetchViewOnlyLinks,
128143
getResourceDetails: GetResourceDetails,
@@ -136,6 +151,9 @@ export class ContributorsComponent implements OnInit {
136151
addContributor: AddContributor,
137152
createViewOnlyLink: CreateViewOnlyLink,
138153
deleteViewOnlyLink: DeleteViewOnlyLink,
154+
getRequestAccessContributors: GetRequestAccessContributors,
155+
acceptRequestAccess: AcceptRequestAccess,
156+
rejectRequestAccess: RejectRequestAccess,
139157
});
140158

141159
get hasChanges(): boolean {
@@ -166,6 +184,10 @@ export class ContributorsComponent implements OnInit {
166184
if (id) {
167185
this.actions.getResourceDetails(id, this.resourceType());
168186
this.actions.getContributors(id, this.resourceType());
187+
188+
if (this.resourceType() === ResourceType.Project) {
189+
this.actions.getRequestAccessContributors(id, this.resourceType());
190+
}
169191
}
170192

171193
this.setSearchSubscription();
@@ -250,6 +272,38 @@ export class ContributorsComponent implements OnInit {
250272
});
251273
}
252274

275+
acceptRequest(contributor: ContributorModel) {
276+
this.customConfirmationService.confirmAccept({
277+
headerKey: 'project.requestAccess.acceptDialog.header',
278+
messageKey: 'project.requestAccess.acceptDialog.message',
279+
messageParams: { name: contributor.fullName },
280+
acceptLabelKey: 'common.buttons.accept',
281+
onConfirm: () => {
282+
const payload = { permissions: contributor.permission };
283+
284+
this.actions
285+
.acceptRequestAccess(contributor.id, this.resourceId(), this.resourceType(), payload)
286+
.pipe(takeUntilDestroyed(this.destroyRef))
287+
.subscribe(() => this.toastService.showSuccess('project.requestAccess.acceptDialog.successMessage'));
288+
},
289+
});
290+
}
291+
292+
rejectRequest(contributor: ContributorModel) {
293+
this.customConfirmationService.confirmDelete({
294+
headerKey: 'project.requestAccess.rejectDialog.header',
295+
messageKey: 'project.requestAccess.rejectDialog.message',
296+
messageParams: { name: contributor.fullName },
297+
acceptLabelKey: 'common.buttons.reject',
298+
onConfirm: () => {
299+
this.actions
300+
.rejectRequestAccess(contributor.id, this.resourceId(), this.resourceType())
301+
.pipe(takeUntilDestroyed(this.destroyRef))
302+
.subscribe(() => this.toastService.showSuccess('project.requestAccess.rejectDialog.successMessage'));
303+
},
304+
});
305+
}
306+
253307
removeContributor(contributor: ContributorModel) {
254308
this.customConfirmationService.confirmDelete({
255309
headerKey: 'project.contributors.removeDialog.title',

src/app/shared/components/contributors/contributors-table/contributors-table.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
[lazy]="true"
1010
[lazyLoadOnInit]="true"
1111
[customSort]="true"
12-
[reorderableColumns]="true"
12+
[reorderableColumns]="!deactivatedContributors()"
1313
(onRowReorder)="onRowReorder()"
1414
class="view-only-table"
1515
>
@@ -176,7 +176,7 @@
176176
</tr>
177177
} @else {
178178
<tr class="loading-row">
179-
<td colspan="7">
179+
<td colspan="8">
180180
<p-skeleton width="100%" height="3.3rem" borderRadius="0" />
181181
</td>
182182
</tr>
@@ -185,7 +185,7 @@
185185

186186
<ng-template pTemplate="emptymessage">
187187
<tr>
188-
<td colspan="7" class="text-center">{{ 'project.contributors.table.emptyMessage' | translate }}</td>
188+
<td colspan="8" class="text-center">{{ 'project.contributors.table.emptyMessage' | translate }}</td>
189189
</tr>
190190
</ng-template>
191191
</p-table>

src/app/shared/components/contributors/contributors-table/contributors-table.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import { Tooltip } from 'primeng/tooltip';
99
import { ChangeDetectionStrategy, Component, computed, inject, input, model, output, signal } from '@angular/core';
1010
import { FormsModule } from '@angular/forms';
1111

12-
import { EducationHistoryDialogComponent } from '@osf/shared/components/education-history-dialog/education-history-dialog.component';
13-
import { EmploymentHistoryDialogComponent } from '@osf/shared/components/employment-history-dialog/employment-history-dialog.component';
1412
import { SelectComponent } from '@osf/shared/components/select/select.component';
1513
import { DEFAULT_TABLE_PARAMS, PERMISSION_OPTIONS } from '@osf/shared/constants';
1614
import { ContributorPermission, ResourceType } from '@osf/shared/enums';
1715
import { ContributorModel, SelectOption, TableParameters } from '@osf/shared/models';
1816
import { CustomDialogService } from '@osf/shared/services';
1917

18+
import { EducationHistoryDialogComponent } from '../../education-history-dialog/education-history-dialog.component';
19+
import { EmploymentHistoryDialogComponent } from '../../employment-history-dialog/employment-history-dialog.component';
2020
import { IconComponent } from '../../icon/icon.component';
2121
import { InfoIconComponent } from '../../info-icon/info-icon.component';
2222

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './add-contributor-dialog/add-contributor-dialog.component';
22
export * from './add-unregistered-contributor-dialog/add-unregistered-contributor-dialog.component';
33
export * from './contributors-table/contributors-table.component';
4+
export * from './request-access-table/request-access-table.component';

0 commit comments

Comments
 (0)