Skip to content

Commit ba5eae9

Browse files
authored
[ENG-9641] Moderation queues do not show more than 10 contributors (#722)
- Ticket: [ENG-9641] - Feature flag: n/a ## Summary of Changes 1. Added load more for preprint modetation.
1 parent 4882fb4 commit ba5eae9

16 files changed

+241
-24
lines changed

src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.html

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,16 @@
3939
</p-accordion-header>
4040

4141
<p-accordion-content>
42-
<div class="flex align-items-baseline gap-1 p-3 pt-0 ml-3">
42+
<div class="flex align-content-start gap-1 p-3 pt-0 ml-3">
4343
<p>{{ 'common.labels.contributors' | translate }}:</p>
4444

45-
@if (submission().contributorsLoading) {
46-
<p-skeleton width="10rem" height="1.25rem" />
47-
} @else {
48-
<osf-contributors-list [contributors]="submission().contributors"></osf-contributors-list>
49-
}
45+
<osf-contributors-list
46+
[contributors]="submission().contributors"
47+
[isLoading]="!!submission().contributorsLoading"
48+
[hasLoadMore]="hasMoreContributors()"
49+
(loadMoreContributors)="loadMoreContributors.emit()"
50+
>
51+
</osf-contributors-list>
5052
</div>
5153
</p-accordion-content>
5254
</p-accordion-panel>

src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ import { TranslatePipe } from '@ngx-translate/core';
22

33
import { Accordion, AccordionContent, AccordionHeader, AccordionPanel } from 'primeng/accordion';
44
import { Button } from 'primeng/button';
5-
import { Skeleton } from 'primeng/skeleton';
65

7-
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
6+
import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';
87

98
import { ContributorsListComponent, IconComponent, TruncatedTextComponent } from '@osf/shared/components';
109
import { StopPropagationDirective } from '@osf/shared/directives';
@@ -27,7 +26,6 @@ import { PreprintSubmissionModel, PreprintWithdrawalSubmission } from '../../mod
2726
AccordionHeader,
2827
AccordionContent,
2928
ContributorsListComponent,
30-
Skeleton,
3129
StopPropagationDirective,
3230
],
3331
templateUrl: './preprint-submission-item.component.html',
@@ -39,6 +37,7 @@ export class PreprintSubmissionItemComponent {
3937
submission = input.required<PreprintSubmissionModel | PreprintWithdrawalSubmission>();
4038
selected = output<void>();
4139
loadContributors = output<void>();
40+
loadMoreContributors = output<void>();
4241

4342
readonly reviewStatusIcon = ReviewStatusIcon;
4443
readonly actionLabel = PREPRINT_ACTION_LABEL;
@@ -47,6 +46,11 @@ export class PreprintSubmissionItemComponent {
4746
limitValue = 1;
4847
showAll = false;
4948

49+
hasMoreContributors = computed(() => {
50+
const submission = this.submission();
51+
return submission.contributors.length < submission.totalContributors;
52+
});
53+
5054
toggleHistory() {
5155
this.showAll = !this.showAll;
5256
}

src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
[status]="selectedReviewOption()"
4242
(selected)="navigateToPreprint(item)"
4343
(loadContributors)="loadContributors(item)"
44+
(loadMoreContributors)="loadMoreContributors(item)"
4445
></osf-preprint-submission-item>
4546
</div>
4647
}

src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.spec.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
1+
import { Store } from '@ngxs/store';
2+
13
import { MockComponents, MockProvider } from 'ng-mocks';
24

35
import { ComponentFixture, TestBed } from '@angular/core/testing';
46
import { ActivatedRoute, Router } from '@angular/router';
57

68
import { PreprintSubmissionItemComponent } from '@osf/features/moderation/components';
7-
import { RegistryModeration } from '@osf/features/moderation/models';
9+
import { PreprintSubmissionModel } from '@osf/features/moderation/models';
810
import { CustomPaginatorComponent, IconComponent, LoadingSpinnerComponent, SelectComponent } from '@shared/components';
911

1012
import { PreprintSubmissionsSort, SubmissionReviewStatus } from '../../enums';
11-
import { PreprintModerationSelectors } from '../../store/preprint-moderation';
13+
import {
14+
GetPreprintSubmissionContributors,
15+
LoadMorePreprintSubmissionContributors,
16+
PreprintModerationSelectors,
17+
} from '../../store/preprint-moderation';
1218

1319
import { PreprintSubmissionsComponent } from './preprint-submissions.component';
1420

15-
import { MOCK_REGISTRY_MODERATIONS } from '@testing/mocks/registry-moderation.mock';
21+
import { MOCK_PREPRINT_SUBMISSIONS } from '@testing/mocks/preprint-submission.mock';
1622
import { OSFTestingModule } from '@testing/osf.testing.module';
1723
import { ActivatedRouteMockBuilder } from '@testing/providers/route-provider.mock';
1824
import { RouterMockBuilder } from '@testing/providers/router-provider.mock';
@@ -23,9 +29,10 @@ describe('PreprintSubmissionsComponent', () => {
2329
let fixture: ComponentFixture<PreprintSubmissionsComponent>;
2430
let mockRouter: ReturnType<RouterMockBuilder['build']>;
2531
let mockActivatedRoute: ReturnType<ActivatedRouteMockBuilder['build']>;
32+
let store: Store;
2633

2734
const mockProviderId = 'test-provider-id';
28-
const mockSubmissions: RegistryModeration[] = MOCK_REGISTRY_MODERATIONS;
35+
const mockSubmissions: PreprintSubmissionModel[] = MOCK_PREPRINT_SUBMISSIONS;
2936

3037
beforeEach(async () => {
3138
mockRouter = RouterMockBuilder.create().build();
@@ -64,6 +71,7 @@ describe('PreprintSubmissionsComponent', () => {
6471

6572
fixture = TestBed.createComponent(PreprintSubmissionsComponent);
6673
component = fixture.componentInstance;
74+
store = TestBed.inject(Store);
6775
fixture.detectChanges();
6876
});
6977

@@ -143,4 +151,22 @@ describe('PreprintSubmissionsComponent', () => {
143151
expect(component.currentPage()).toBe(1);
144152
expect(component.first()).toBe(0);
145153
});
154+
155+
it('should load contributors for a submission', () => {
156+
const mockItem = mockSubmissions[0];
157+
const dispatchSpy = jest.spyOn(store, 'dispatch');
158+
159+
component.loadContributors(mockItem);
160+
161+
expect(dispatchSpy).toHaveBeenCalledWith(new GetPreprintSubmissionContributors(mockItem.id));
162+
});
163+
164+
it('should load more contributors for a submission', () => {
165+
const mockItem = mockSubmissions[0];
166+
const dispatchSpy = jest.spyOn(store, 'dispatch');
167+
168+
component.loadMoreContributors(mockItem);
169+
170+
expect(dispatchSpy).toHaveBeenCalledWith(new LoadMorePreprintSubmissionContributors(mockItem.id));
171+
});
146172
});

src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { PreprintSubmissionModel } from '../../models';
2828
import {
2929
GetPreprintSubmissionContributors,
3030
GetPreprintSubmissions,
31+
LoadMorePreprintSubmissionContributors,
3132
PreprintModerationSelectors,
3233
} from '../../store/preprint-moderation';
3334

@@ -60,6 +61,7 @@ export class PreprintSubmissionsComponent implements OnInit {
6061
readonly actions = createDispatchMap({
6162
getPreprintSubmissions: GetPreprintSubmissions,
6263
getPreprintSubmissionContributors: GetPreprintSubmissionContributors,
64+
loadMorePreprintSubmissionContributors: LoadMorePreprintSubmissionContributors,
6365
});
6466

6567
readonly submissions = select(PreprintModerationSelectors.getPreprintSubmissions);
@@ -131,6 +133,10 @@ export class PreprintSubmissionsComponent implements OnInit {
131133
this.actions.getPreprintSubmissionContributors(item.id);
132134
}
133135

136+
loadMoreContributors(item: PreprintSubmissionModel) {
137+
this.actions.loadMorePreprintSubmissionContributors(item.id);
138+
}
139+
134140
private getStatusFromQueryParams() {
135141
const queryParams = this.route.snapshot.queryParams;
136142
const statusValues = Object.values(SubmissionReviewStatus);

src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
[status]="selectedReviewOption()"
4242
(selected)="navigateToPreprint(item)"
4343
(loadContributors)="loadContributors(item)"
44+
(loadMoreContributors)="loadMoreContributors(item)"
4445
></osf-preprint-submission-item>
4546
</div>
4647
}

src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.spec.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { Store } from '@ngxs/store';
2+
13
import { MockComponents, MockProvider } from 'ng-mocks';
24

35
import { ComponentFixture, TestBed } from '@angular/core/testing';
@@ -8,7 +10,11 @@ import { PreprintWithdrawalSubmission } from '@osf/features/moderation/models';
810
import { CustomPaginatorComponent, IconComponent, LoadingSpinnerComponent, SelectComponent } from '@shared/components';
911

1012
import { PreprintSubmissionsSort, SubmissionReviewStatus } from '../../enums';
11-
import { PreprintModerationSelectors } from '../../store/preprint-moderation';
13+
import {
14+
GetPreprintWithdrawalSubmissionContributors,
15+
LoadMorePreprintWithdrawalSubmissionContributors,
16+
PreprintModerationSelectors,
17+
} from '../../store/preprint-moderation';
1218

1319
import { PreprintWithdrawalSubmissionsComponent } from './preprint-withdrawal-submissions.component';
1420

@@ -23,6 +29,7 @@ describe('PreprintWithdrawalSubmissionsComponent', () => {
2329
let fixture: ComponentFixture<PreprintWithdrawalSubmissionsComponent>;
2430
let mockRouter: ReturnType<RouterMockBuilder['build']>;
2531
let mockActivatedRoute: ReturnType<ActivatedRouteMockBuilder['build']>;
32+
let store: Store;
2633

2734
const mockProviderId = 'test-provider-id';
2835
const mockSubmissions: PreprintWithdrawalSubmission[] = MOCK_PREPRINT_WITHDRAWAL_SUBMISSIONS;
@@ -74,6 +81,7 @@ describe('PreprintWithdrawalSubmissionsComponent', () => {
7481

7582
fixture = TestBed.createComponent(PreprintWithdrawalSubmissionsComponent);
7683
component = fixture.componentInstance;
84+
store = TestBed.inject(Store);
7785
fixture.detectChanges();
7886
});
7987

@@ -164,4 +172,26 @@ describe('PreprintWithdrawalSubmissionsComponent', () => {
164172
expect(component.currentPage()).toBe(1);
165173
expect(component.first()).toBe(0);
166174
});
175+
176+
it('should load contributors for a withdrawal submission', () => {
177+
const mockItem = mockSubmissions[0];
178+
const dispatchSpy = jest.spyOn(store, 'dispatch');
179+
180+
component.loadContributors(mockItem);
181+
182+
expect(dispatchSpy).toHaveBeenCalledWith(
183+
new GetPreprintWithdrawalSubmissionContributors(mockItem.id, mockItem.preprintId)
184+
);
185+
});
186+
187+
it('should load more contributors for a withdrawal submission', () => {
188+
const mockItem = mockSubmissions[0];
189+
const dispatchSpy = jest.spyOn(store, 'dispatch');
190+
191+
component.loadMoreContributors(mockItem);
192+
193+
expect(dispatchSpy).toHaveBeenCalledWith(
194+
new LoadMorePreprintWithdrawalSubmissionContributors(mockItem.id, mockItem.preprintId)
195+
);
196+
});
167197
});

src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { PreprintWithdrawalSubmission } from '../../models';
2727
import {
2828
GetPreprintWithdrawalSubmissionContributors,
2929
GetPreprintWithdrawalSubmissions,
30+
LoadMorePreprintWithdrawalSubmissionContributors,
3031
PreprintModerationSelectors,
3132
} from '../../store/preprint-moderation';
3233
import { PreprintSubmissionItemComponent } from '../preprint-submission-item/preprint-submission-item.component';
@@ -60,6 +61,7 @@ export class PreprintWithdrawalSubmissionsComponent implements OnInit {
6061
readonly actions = createDispatchMap({
6162
getPreprintWithdrawalSubmissions: GetPreprintWithdrawalSubmissions,
6263
getPreprintWithdrawalSubmissionContributors: GetPreprintWithdrawalSubmissionContributors,
64+
loadMorePreprintWithdrawalSubmissionContributors: LoadMorePreprintWithdrawalSubmissionContributors,
6365
});
6466

6567
readonly submissions = select(PreprintModerationSelectors.getPreprintWithdrawalSubmissions);
@@ -128,6 +130,10 @@ export class PreprintWithdrawalSubmissionsComponent implements OnInit {
128130
this.actions.getPreprintWithdrawalSubmissionContributors(item.id, item.preprintId);
129131
}
130132

133+
loadMoreContributors(item: PreprintWithdrawalSubmission) {
134+
this.actions.loadMorePreprintWithdrawalSubmissionContributors(item.id, item.preprintId);
135+
}
136+
131137
private getStatusFromQueryParams() {
132138
const queryParams = this.route.snapshot.queryParams;
133139
const statusValues = Object.values(SubmissionReviewStatus);

src/app/features/moderation/models/preprint-submission.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ export interface PreprintSubmissionModel {
1818
contributors: ContributorModel[];
1919
totalContributors: number;
2020
contributorsLoading?: boolean;
21+
contributorsPage?: number;
2122
}

src/app/features/moderation/models/preprint-withdrawal-submission.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ export interface PreprintWithdrawalSubmission {
1616
contributors: ContributorModel[];
1717
totalContributors: number;
1818
contributorsLoading?: boolean;
19+
contributorsPage?: number;
1920
}

0 commit comments

Comments
 (0)