Skip to content

Commit 4c512b4

Browse files
committed
fix(moderators): fixed moderators rights
1 parent f8a166f commit 4c512b4

File tree

11 files changed

+54
-25
lines changed

11 files changed

+54
-25
lines changed

src/app/core/store/provider/provider.selectors.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Selector } from '@ngxs/store';
22

3+
import { ReviewPermissions } from '@osf/shared/enums';
34
import { ProviderShortInfoModel } from '@osf/shared/models';
45

56
import { ProviderStateModel } from './provider.model';
@@ -10,4 +11,12 @@ export class ProviderSelectors {
1011
static getCurrentProvider(state: ProviderStateModel): ProviderShortInfoModel | null {
1112
return state.currentProvider;
1213
}
14+
15+
@Selector([ProviderState])
16+
static hasAdminAccess(state: ProviderStateModel): boolean {
17+
return (
18+
state.currentProvider?.permissions?.some((permission) => permission === ReviewPermissions.SetUpModeration) ||
19+
false
20+
);
21+
}
1322
}

src/app/features/moderation/components/moderators-list/moderators-list.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div class="flex flex-column gap-4 md:flex-row md:gap-6">
22
<osf-search-input class="w-full" [control]="searchControl" [placeholder]="'common.search.title' | translate" />
33

4-
@if (isCurrentUserAdminModerator()) {
4+
@if (hasAdminAccess()) {
55
<div class="ml-auto w-full md:w-4">
66
<p-button
77
class="w-full"
@@ -20,7 +20,7 @@
2020
[isLoading]="isModeratorsLoading()"
2121
[currentUserId]="currentUser()?.id"
2222
[tableParams]="tableParams()"
23-
[isCurrentUserAdminModerator]="isCurrentUserAdminModerator()"
23+
[hasAdminAccess]="hasAdminAccess()"
2424
(pageChanged)="pageChanged($event)"
2525
(update)="updateModerator($event)"
2626
(remove)="removeModerator($event)"

src/app/features/moderation/components/moderators-list/moderators-list.component.ts

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
2222
import { FormControl } from '@angular/forms';
2323
import { ActivatedRoute } from '@angular/router';
2424

25+
import { ProviderSelectors } from '@core/store/provider';
2526
import { UserSelectors } from '@core/store/user';
2627
import { SearchInputComponent } from '@osf/shared/components';
2728
import { DEFAULT_TABLE_PARAMS } from '@osf/shared/constants';
2829
import { ResourceType } from '@osf/shared/enums';
2930
import { TableParameters } from '@osf/shared/models';
3031
import { CustomConfirmationService, CustomDialogService, ToastService } from '@osf/shared/services';
3132

32-
import { AddModeratorType, ModeratorPermission } from '../../enums';
33+
import { AddModeratorType } from '../../enums';
3334
import { ModeratorDialogAddModel, ModeratorModel } from '../../models';
3435
import {
3536
AddModerator,
@@ -70,6 +71,7 @@ export class ModeratorsListComponent implements OnInit {
7071
initialModerators = select(ModeratorsSelectors.getModerators);
7172
isModeratorsLoading = select(ModeratorsSelectors.isModeratorsLoading);
7273
moderatorsTotalCount = select(ModeratorsSelectors.getModeratorsTotalCount);
74+
hasAdminAccess = select(ProviderSelectors.hasAdminAccess);
7375
currentUser = select(UserSelectors.getCurrentUser);
7476

7577
readonly tableParams = computed<TableParameters>(() => ({
@@ -78,17 +80,6 @@ export class ModeratorsListComponent implements OnInit {
7880
paginator: this.moderatorsTotalCount() > DEFAULT_TABLE_PARAMS.rows,
7981
}));
8082

81-
isCurrentUserAdminModerator = computed(() => {
82-
const currentUserId = this.currentUser()?.id;
83-
const initialModerators = this.initialModerators();
84-
if (!currentUserId) return false;
85-
86-
return initialModerators.some(
87-
(moderator: ModeratorModel) =>
88-
moderator.userId === currentUserId && moderator.permission === ModeratorPermission.Admin
89-
);
90-
});
91-
9283
actions = createDispatchMap({
9384
loadModerators: LoadModerators,
9485
updateSearchValue: UpdateModeratorsSearchValue,

src/app/features/moderation/components/moderators-table/moderators-table.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
</td>
3838
<td>
3939
<div>
40-
@if (isCurrentUserAdminModerator()) {
40+
@if (hasAdminAccess()) {
4141
<osf-select
4242
[options]="permissionsOptions"
4343
[placeholder]="'project.contributors.permissionFilter'"
@@ -89,15 +89,15 @@
8989
</div>
9090
</td>
9191
<td>
92-
@if (isCurrentUserAdminModerator() || currentUserId() === item.id) {
92+
@if (hasAdminAccess() || currentUserId() === item.id) {
9393
<p-button
9494
class="danger-icon-btn"
9595
icon="fas fa-trash"
9696
severity="danger"
9797
text
9898
(onClick)="removeModerator(item)"
9999
[ariaLabel]="'common.buttons.delete' | translate"
100-
[disabled]="!isCurrentUserAdminModerator() && currentUserId() !== item.id"
100+
[disabled]="!hasAdminAccess() && currentUserId() !== item.id"
101101
/>
102102
}
103103
</td>

src/app/features/moderation/components/moderators-table/moderators-table.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class ModeratorsTableComponent {
3131
isLoading = input(false);
3232
tableParams = input.required<TableParameters>();
3333
currentUserId = input.required<string | undefined>();
34-
isCurrentUserAdminModerator = input.required<boolean>();
34+
hasAdminAccess = input.required<boolean>();
3535

3636
update = output<ModeratorModel>();
3737
remove = output<ModeratorModel>();

src/app/features/moderation/mappers/preprint-moderation.mapper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export class PreprintModerationMapper {
5050
return {
5151
id: response.id,
5252
name: response.attributes.name,
53+
permissions: response.attributes.permissions,
5354
reviewsCommentsAnonymous: response.attributes.reviews_comments_anonymous,
5455
reviewsCommentsPrivate: response.attributes.reviews_comments_private,
5556
reviewsWorkflow: response.attributes.reviews_workflow,
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import { ReviewPermissions } from '@osf/shared/enums';
2+
13
export interface PreprintProviderModerationInfo {
24
id: string;
35
name: string;
4-
submissionCount?: number;
6+
permissions: ReviewPermissions[];
57
reviewsCommentsAnonymous: boolean;
68
reviewsCommentsPrivate: boolean;
79
reviewsWorkflow: string;
10+
submissionCount?: number;
811
supportEmail: string | null;
912
}

src/app/features/moderation/pages/preprint-moderation/preprint-moderation.component.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { createDispatchMap } from '@ngxs/store';
2+
13
import { TranslatePipe } from '@ngx-translate/core';
24

35
import { Tab, TabList, TabPanels, Tabs } from 'primeng/tabs';
@@ -13,6 +15,7 @@ import { IS_MEDIUM, Primitive } from '@osf/shared/helpers';
1315

1416
import { PREPRINT_MODERATION_TABS } from '../../constants';
1517
import { PreprintModerationTab } from '../../enums';
18+
import { GetPreprintProvider } from '../../store/preprint-moderation';
1619

1720
@Component({
1821
selector: 'osf-preprint-moderation',
@@ -41,8 +44,19 @@ export class PreprintModerationComponent implements OnInit {
4144

4245
selectedTab = PreprintModerationTab.Submissions;
4346

47+
private readonly actions = createDispatchMap({ getPreprintProvider: GetPreprintProvider });
48+
4449
ngOnInit(): void {
4550
this.selectedTab = this.route.snapshot.firstChild?.data['tab'] as PreprintModerationTab;
51+
52+
const id = this.route.snapshot.params['providerId'];
53+
54+
if (!id) {
55+
this.router.navigate(['/not-found']);
56+
return;
57+
}
58+
59+
this.actions.getPreprintProvider(id);
4660
}
4761

4862
onTabChange(value: Primitive): void {

src/app/features/moderation/services/preprint-moderation.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { catchError, forkJoin, map, Observable, of, switchMap } from 'rxjs';
33
import { inject, Injectable } from '@angular/core';
44

55
import { ENVIRONMENT } from '@core/provider/environment.provider';
6-
import { JsonApiResponse, PaginatedData, ResponseJsonApi } from '@osf/shared/models';
6+
import { PaginatedData, ResponseJsonApi } from '@osf/shared/models';
77
import { JsonApiService } from '@osf/shared/services';
88

99
import { PreprintSubmissionsSort } from '../enums';
@@ -36,15 +36,15 @@ export class PreprintModerationService {
3636
const baseUrl = `${this.apiUrl}/providers/preprints/?filter[permissions]=view_actions,set_up_moderation`;
3737

3838
return this.jsonApiService
39-
.get<JsonApiResponse<PreprintRelatedCountJsonApi[], null>>(baseUrl)
39+
.get<ResponseJsonApi<PreprintRelatedCountJsonApi[]>>(baseUrl)
4040
.pipe(map((response) => response.data.map((x) => PreprintModerationMapper.fromPreprintRelatedCounts(x))));
4141
}
4242

4343
getPreprintProvider(id: string): Observable<PreprintProviderModerationInfo> {
4444
const baseUrl = `${this.apiUrl}/providers/preprints/${id}/?related_counts=true`;
4545

4646
return this.jsonApiService
47-
.get<JsonApiResponse<PreprintRelatedCountJsonApi, null>>(baseUrl)
47+
.get<ResponseJsonApi<PreprintRelatedCountJsonApi>>(baseUrl)
4848
.pipe(map((response) => PreprintModerationMapper.fromPreprintRelatedCounts(response.data)));
4949
}
5050

src/app/features/moderation/store/moderators/moderators.state.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export class ModeratorsState {
8888
}
8989

9090
@Action(UpdateModerator)
91-
updateCollectionModerator(ctx: StateContext<ModeratorsStateModel>, action: UpdateModerator) {
91+
updateModerator(ctx: StateContext<ModeratorsStateModel>, action: UpdateModerator) {
9292
const state = ctx.getState();
9393

9494
if (!action.resourceType) {
@@ -108,7 +108,7 @@ export class ModeratorsState {
108108
}
109109

110110
@Action(DeleteModerator)
111-
deleteCollectionModerator(ctx: StateContext<ModeratorsStateModel>, action: DeleteModerator) {
111+
deleteModerator(ctx: StateContext<ModeratorsStateModel>, action: DeleteModerator) {
112112
const state = ctx.getState();
113113

114114
if (!action.resourceType) {

0 commit comments

Comments
 (0)