From 687de182450a8b2ea77cc88edf667714bd8b1626 Mon Sep 17 00:00:00 2001 From: nsemets Date: Mon, 20 Oct 2025 15:42:39 +0300 Subject: [PATCH] fix(preprint-submission): updated contributors --- .../preprint-submission-item.component.html | 79 +++++--- ...preprint-submission-item.component.spec.ts | 8 +- .../preprint-submission-item.component.ts | 29 ++- .../preprint-submissions.component.html | 1 + .../preprint-submissions.component.ts | 19 +- ...rint-withdrawal-submissions.component.html | 1 + ...eprint-withdrawal-submissions.component.ts | 15 +- .../mappers/preprint-moderation.mapper.ts | 4 + .../models/preprint-submission.model.ts | 9 +- .../preprint-withdrawal-submission.model.ts | 5 +- .../services/preprint-moderation.service.ts | 67 +++++-- .../preprint-moderation.actions.ts | 15 ++ .../preprint-moderation.model.ts | 4 +- .../preprint-moderation.state.ts | 172 +++++++++++++----- src/testing/mocks/contributors.mock.ts | 4 + src/testing/mocks/submission.mock.ts | 8 +- 16 files changed, 327 insertions(+), 113 deletions(-) diff --git a/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.html b/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.html index 6153af516..ae7decd48 100644 --- a/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.html +++ b/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.html @@ -1,35 +1,54 @@ -
- +
+ + + +
+ -
- +
+ + @for (action of showAll ? submission().actions : submission().actions.slice(0, limitValue); track $index) { +
+ {{ actionLabel[action.toState] | translate }} + {{ action.dateModified | dateAgo }} + {{ 'moderation.submissionReview.by' | translate }} + {{ action.creator?.name }} - @for (action of showAll ? submission().actions : submission().actions.slice(0, limitValue); track $index) { -
- {{ actionLabel[action.toState] | translate }} - {{ action.dateModified | dateAgo }} - {{ 'moderation.submissionReview.by' | translate }} - {{ action.creator?.name }} + @if (action.comment.length) { + + } +
+ } - @if (action.comment.length) { - - } -
- } + @if (submission().actions.length > 1) { + + } +
+
+ - @if (submission().actions.length > 1) { - - } -
+ +
+

{{ 'common.labels.contributors' | translate }}:

+ + @if (submission().contributorsLoading) { + + } @else { + + } +
+
+
+
diff --git a/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.spec.ts b/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.spec.ts index 11749a014..02d4c7035 100644 --- a/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.spec.ts +++ b/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.spec.ts @@ -3,11 +3,11 @@ import { MockComponents, MockPipes } from 'ng-mocks'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { IconComponent } from '@osf/shared/components'; +import { ContributorsListComponent, IconComponent } from '@osf/shared/components'; import { DateAgoPipe } from '@osf/shared/pipes'; import { SubmissionReviewStatus } from '../../enums'; -import { PreprintSubmission } from '../../models'; +import { PreprintSubmissionModel } from '../../models'; import { PreprintSubmissionItemComponent } from './preprint-submission-item.component'; @@ -18,14 +18,14 @@ describe('PreprintSubmissionItemComponent', () => { let component: PreprintSubmissionItemComponent; let fixture: ComponentFixture; - const mockSubmission: PreprintSubmission = MOCK_PREPRINT_SUBMISSION; + const mockSubmission: PreprintSubmissionModel = MOCK_PREPRINT_SUBMISSION; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ PreprintSubmissionItemComponent, OSFTestingModule, - ...MockComponents(IconComponent), + ...MockComponents(IconComponent, ContributorsListComponent), MockPipes(DateAgoPipe, TranslatePipe), ], }).compileComponents(); diff --git a/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.ts b/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.ts index 1c57a1de2..4541bb200 100644 --- a/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.ts +++ b/src/app/features/moderation/components/preprint-submission-item/preprint-submission-item.component.ts @@ -1,27 +1,44 @@ import { TranslatePipe } from '@ngx-translate/core'; +import { Accordion, AccordionContent, AccordionHeader, AccordionPanel } from 'primeng/accordion'; import { Button } from 'primeng/button'; +import { Skeleton } from 'primeng/skeleton'; import { ChangeDetectionStrategy, Component, input, output } from '@angular/core'; -import { IconComponent, TruncatedTextComponent } from '@osf/shared/components'; +import { ContributorsListComponent, IconComponent, TruncatedTextComponent } from '@osf/shared/components'; +import { StopPropagationDirective } from '@osf/shared/directives'; import { DateAgoPipe } from '@osf/shared/pipes'; import { PREPRINT_ACTION_LABEL, ReviewStatusIcon } from '../../constants'; import { ActionStatus, SubmissionReviewStatus } from '../../enums'; -import { PreprintSubmission, PreprintWithdrawalSubmission } from '../../models'; +import { PreprintSubmissionModel, PreprintWithdrawalSubmission } from '../../models'; @Component({ selector: 'osf-preprint-submission-item', - imports: [IconComponent, DateAgoPipe, Button, TranslatePipe, TruncatedTextComponent], + imports: [ + IconComponent, + DateAgoPipe, + Button, + TranslatePipe, + TruncatedTextComponent, + Accordion, + AccordionPanel, + AccordionHeader, + AccordionContent, + ContributorsListComponent, + Skeleton, + StopPropagationDirective, + ], templateUrl: './preprint-submission-item.component.html', styleUrl: './preprint-submission-item.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, }) export class PreprintSubmissionItemComponent { status = input.required(); - submission = input.required(); + submission = input.required(); selected = output(); + loadContributors = output(); readonly reviewStatusIcon = ReviewStatusIcon; readonly actionLabel = PREPRINT_ACTION_LABEL; @@ -33,4 +50,8 @@ export class PreprintSubmissionItemComponent { toggleHistory() { this.showAll = !this.showAll; } + + handleOpen() { + this.loadContributors.emit(); + } } diff --git a/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.html b/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.html index 8d19a002f..51c7dc27f 100644 --- a/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.html +++ b/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.html @@ -40,6 +40,7 @@ [submission]="item" [status]="selectedReviewOption()" (selected)="navigateToPreprint(item)" + (loadContributors)="loadContributors(item)" >
} diff --git a/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.ts b/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.ts index 25039c046..094fcd2fd 100644 --- a/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.ts +++ b/src/app/features/moderation/components/preprint-submissions/preprint-submissions.component.ts @@ -24,8 +24,12 @@ import { } from '@osf/shared/components'; import { Primitive } from '@osf/shared/helpers'; -import { PreprintSubmission } from '../../models'; -import { GetPreprintSubmissions, PreprintModerationSelectors } from '../../store/preprint-moderation'; +import { PreprintSubmissionModel } from '../../models'; +import { + GetPreprintSubmissionContributors, + GetPreprintSubmissions, + PreprintModerationSelectors, +} from '../../store/preprint-moderation'; @Component({ selector: 'osf-preprint-submissions', @@ -53,7 +57,10 @@ export class PreprintSubmissionsComponent implements OnInit { this.route.parent?.params.pipe(map((params) => params['providerId'])) ?? of(undefined) ); - readonly actions = createDispatchMap({ getPreprintSubmissions: GetPreprintSubmissions }); + readonly actions = createDispatchMap({ + getPreprintSubmissions: GetPreprintSubmissions, + getPreprintSubmissionContributors: GetPreprintSubmissionContributors, + }); readonly submissions = select(PreprintModerationSelectors.getPreprintSubmissions); readonly isLoading = select(PreprintModerationSelectors.arePreprintSubmissionsLoading); @@ -112,7 +119,7 @@ export class PreprintSubmissionsComponent implements OnInit { this.fetchSubmissions(); } - navigateToPreprint(item: PreprintSubmission) { + navigateToPreprint(item: PreprintSubmissionModel) { const url = this.router.serializeUrl( this.router.createUrlTree(['/preprints/', this.providerId(), item.id], { queryParams: { mode: 'moderator' } }) ); @@ -120,6 +127,10 @@ export class PreprintSubmissionsComponent implements OnInit { window.open(url, '_blank'); } + loadContributors(item: PreprintSubmissionModel) { + this.actions.getPreprintSubmissionContributors(item.id); + } + private getStatusFromQueryParams() { const queryParams = this.route.snapshot.queryParams; const statusValues = Object.values(SubmissionReviewStatus); diff --git a/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.html b/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.html index a129c5ca3..01e06c618 100644 --- a/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.html +++ b/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.html @@ -40,6 +40,7 @@ [submission]="item" [status]="selectedReviewOption()" (selected)="navigateToPreprint(item)" + (loadContributors)="loadContributors(item)" > } diff --git a/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.ts b/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.ts index 92754ff91..3517a572b 100644 --- a/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.ts +++ b/src/app/features/moderation/components/preprint-withdrawal-submissions/preprint-withdrawal-submissions.component.ts @@ -24,7 +24,11 @@ import { import { Primitive } from '@osf/shared/helpers'; import { PreprintWithdrawalSubmission } from '../../models'; -import { GetPreprintWithdrawalSubmissions, PreprintModerationSelectors } from '../../store/preprint-moderation'; +import { + GetPreprintWithdrawalSubmissionContributors, + GetPreprintWithdrawalSubmissions, + PreprintModerationSelectors, +} from '../../store/preprint-moderation'; import { PreprintSubmissionItemComponent } from '../preprint-submission-item/preprint-submission-item.component'; @Component({ @@ -53,7 +57,10 @@ export class PreprintWithdrawalSubmissionsComponent implements OnInit { this.route.parent?.params.pipe(map((params) => params['providerId'])) ?? of(undefined) ); - readonly actions = createDispatchMap({ getPreprintWithdrawalSubmissions: GetPreprintWithdrawalSubmissions }); + readonly actions = createDispatchMap({ + getPreprintWithdrawalSubmissions: GetPreprintWithdrawalSubmissions, + getPreprintWithdrawalSubmissionContributors: GetPreprintWithdrawalSubmissionContributors, + }); readonly submissions = select(PreprintModerationSelectors.getPreprintWithdrawalSubmissions); readonly isLoading = select(PreprintModerationSelectors.arePreprintWithdrawalSubmissionsLoading); @@ -117,6 +124,10 @@ export class PreprintWithdrawalSubmissionsComponent implements OnInit { window.open(url, '_blank'); } + loadContributors(item: PreprintWithdrawalSubmission) { + this.actions.getPreprintWithdrawalSubmissionContributors(item.id, item.preprintId); + } + private getStatusFromQueryParams() { const queryParams = this.route.snapshot.queryParams; const statusValues = Object.values(SubmissionReviewStatus); diff --git a/src/app/features/moderation/mappers/preprint-moderation.mapper.ts b/src/app/features/moderation/mappers/preprint-moderation.mapper.ts index a480fb4ce..0912104be 100644 --- a/src/app/features/moderation/mappers/preprint-moderation.mapper.ts +++ b/src/app/features/moderation/mappers/preprint-moderation.mapper.ts @@ -66,6 +66,8 @@ export class PreprintModerationMapper { public: x.attributes.public, reviewsState: x.attributes.reviews_state, actions: [], + contributors: [], + totalContributors: 0, })), totalCount: response.meta.total, pageSize: response.meta.per_page, @@ -85,6 +87,8 @@ export class PreprintModerationMapper { title: x.embeds.target.data.attributes.title, preprintId: x.embeds.target.data.id, actions: [], + contributors: [], + totalContributors: 0, })), totalCount: response.meta.total, pageSize: response.meta.per_page, diff --git a/src/app/features/moderation/models/preprint-submission.model.ts b/src/app/features/moderation/models/preprint-submission.model.ts index 1a829ee38..998a1fa8f 100644 --- a/src/app/features/moderation/models/preprint-submission.model.ts +++ b/src/app/features/moderation/models/preprint-submission.model.ts @@ -1,18 +1,21 @@ -import { PaginatedData } from '@osf/shared/models'; +import { ContributorModel, PaginatedData } from '@osf/shared/models'; import { ReviewAction } from './review-action.model'; -export interface PreprintSubmissionPaginatedData extends PaginatedData { +export interface PreprintSubmissionPaginatedData extends PaginatedData { pendingCount: number; acceptedCount: number; rejectedCount: number; withdrawnCount: number; } -export interface PreprintSubmission { +export interface PreprintSubmissionModel { id: string; title: string; reviewsState: string; public: boolean; actions: ReviewAction[]; + contributors: ContributorModel[]; + totalContributors: number; + contributorsLoading?: boolean; } diff --git a/src/app/features/moderation/models/preprint-withdrawal-submission.model.ts b/src/app/features/moderation/models/preprint-withdrawal-submission.model.ts index a7490e009..b75e0dc7a 100644 --- a/src/app/features/moderation/models/preprint-withdrawal-submission.model.ts +++ b/src/app/features/moderation/models/preprint-withdrawal-submission.model.ts @@ -1,4 +1,4 @@ -import { PaginatedData } from '@osf/shared/models'; +import { ContributorModel, PaginatedData } from '@osf/shared/models'; import { ReviewAction } from './review-action.model'; @@ -13,4 +13,7 @@ export interface PreprintWithdrawalSubmission { title: string; preprintId: string; actions: ReviewAction[]; + contributors: ContributorModel[]; + totalContributors: number; + contributorsLoading?: boolean; } diff --git a/src/app/features/moderation/services/preprint-moderation.service.ts b/src/app/features/moderation/services/preprint-moderation.service.ts index b98d35af5..c33a8dd9b 100644 --- a/src/app/features/moderation/services/preprint-moderation.service.ts +++ b/src/app/features/moderation/services/preprint-moderation.service.ts @@ -1,4 +1,4 @@ -import { map, Observable } from 'rxjs'; +import { catchError, forkJoin, map, Observable, of, switchMap } from 'rxjs'; import { inject, Injectable } from '@angular/core'; @@ -62,13 +62,31 @@ export class PreprintModerationService { page = 1, sort = PreprintSubmissionsSort.Newest ): Observable { - const filters = `filter[reviews_state]=${status}`; - - const baseUrl = `${this.apiUrl}/providers/preprints/${provider}/preprints/?page=${page}&meta[reviews_state_counts]=true&${filters}&sort=${sort}`; - - return this.jsonApiService - .get(baseUrl) - .pipe(map((response) => PreprintModerationMapper.fromSubmissionResponse(response))); + const params = { + page: page.toString(), + 'meta[reviews_state_counts]': 'true', + 'filter[reviews_state]': status, + sort, + }; + + const baseUrl = `${this.apiUrl}/providers/preprints/${provider}/preprints/`; + + return this.jsonApiService.get(baseUrl, params).pipe( + map((response) => PreprintModerationMapper.fromSubmissionResponse(response)), + switchMap((res) => { + if (!res.data.length) { + return of(res); + } + + const actionsRequests = res.data.map((item) => + this.getPreprintSubmissionReviewAction(item.id).pipe(catchError(() => of([]))) + ); + + return forkJoin(actionsRequests).pipe( + map((actions) => ({ ...res, data: res.data.map((item, i) => ({ ...item, actions: actions[i] })) })) + ); + }) + ); } getPreprintWithdrawalSubmissions( @@ -77,13 +95,32 @@ export class PreprintModerationService { page = 1, sort = PreprintSubmissionsSort.Newest ): Observable { - const params = `?embed=target&embed=creator&filter[machine_state]=${status}&meta[requests_state_counts]=true&page=${page}&sort=${sort}`; - - const baseUrl = `${this.apiUrl}/providers/preprints/${provider}/withdraw_requests/${params}`; - - return this.jsonApiService - .get(baseUrl) - .pipe(map((response) => PreprintModerationMapper.fromWithdrawalSubmissionResponse(response))); + const params = { + embed: 'target', + 'meta[requests_state_counts]': 'true', + 'filter[machine_state]': status, + page, + sort, + }; + + const baseUrl = `${this.apiUrl}/providers/preprints/${provider}/withdraw_requests/`; + + return this.jsonApiService.get(baseUrl, params).pipe( + map((response) => PreprintModerationMapper.fromWithdrawalSubmissionResponse(response)), + switchMap((res) => { + if (!res.data.length) { + return of(res); + } + + const actionsRequests = res.data.map((item) => + this.getPreprintWithdrawalSubmissionReviewAction(item.id).pipe(catchError(() => of([]))) + ); + + return forkJoin(actionsRequests).pipe( + map((actions) => ({ ...res, data: res.data.map((item, i) => ({ ...item, actions: actions[i] })) })) + ); + }) + ); } getPreprintSubmissionReviewAction(id: string): Observable { diff --git a/src/app/features/moderation/store/preprint-moderation/preprint-moderation.actions.ts b/src/app/features/moderation/store/preprint-moderation/preprint-moderation.actions.ts index 86a611229..bdcb30368 100644 --- a/src/app/features/moderation/store/preprint-moderation/preprint-moderation.actions.ts +++ b/src/app/features/moderation/store/preprint-moderation/preprint-moderation.actions.ts @@ -39,3 +39,18 @@ export class GetPreprintWithdrawalSubmissions { public sort?: PreprintSubmissionsSort ) {} } + +export class GetPreprintSubmissionContributors { + static readonly type = `${ACTION_SCOPE} Get Preprint Submission Contributors`; + + constructor(public preprintId: string) {} +} + +export class GetPreprintWithdrawalSubmissionContributors { + static readonly type = `${ACTION_SCOPE} Get Preprint Withdrawal Submission Contributors`; + + constructor( + public submissionId: string, + public preprintId: string + ) {} +} diff --git a/src/app/features/moderation/store/preprint-moderation/preprint-moderation.model.ts b/src/app/features/moderation/store/preprint-moderation/preprint-moderation.model.ts index c65ab3d11..a846bc440 100644 --- a/src/app/features/moderation/store/preprint-moderation/preprint-moderation.model.ts +++ b/src/app/features/moderation/store/preprint-moderation/preprint-moderation.model.ts @@ -1,7 +1,7 @@ import { AsyncStateModel, AsyncStateWithTotalCount } from '@osf/shared/models'; import { PreprintProviderModerationInfo, PreprintReviewActionModel, PreprintWithdrawalSubmission } from '../../models'; -import { PreprintSubmission } from '../../models/preprint-submission.model'; +import { PreprintSubmissionModel } from '../../models/preprint-submission.model'; export interface PreprintModerationStateModel { preprintProviders: AsyncStateModel; @@ -10,7 +10,7 @@ export interface PreprintModerationStateModel { withdrawalSubmissions: WithdrawalSubmissionsWithCount; } -interface SubmissionsWithCount extends AsyncStateWithTotalCount { +interface SubmissionsWithCount extends AsyncStateWithTotalCount { pendingCount: number; acceptedCount: number; rejectedCount: number; diff --git a/src/app/features/moderation/store/preprint-moderation/preprint-moderation.state.ts b/src/app/features/moderation/store/preprint-moderation/preprint-moderation.state.ts index 2b9ffeeca..b02da84e9 100644 --- a/src/app/features/moderation/store/preprint-moderation/preprint-moderation.state.ts +++ b/src/app/features/moderation/store/preprint-moderation/preprint-moderation.state.ts @@ -1,20 +1,25 @@ import { Action, State, StateContext } from '@ngxs/store'; import { insertItem, patch, updateItem } from '@ngxs/store/operators'; -import { catchError, forkJoin, map, of, switchMap, tap } from 'rxjs'; +import { catchError, forkJoin, map, switchMap, tap } from 'rxjs'; import { inject, Injectable } from '@angular/core'; +import { DEFAULT_TABLE_PARAMS } from '@osf/shared/constants'; +import { ResourceType } from '@osf/shared/enums'; import { handleSectionError } from '@osf/shared/helpers'; +import { ContributorsService } from '@osf/shared/services'; -import { PreprintSubmissionPaginatedData, PreprintWithdrawalPaginatedData } from '../../models'; +import { PreprintSubmissionModel, PreprintWithdrawalSubmission } from '../../models'; import { PreprintModerationService } from '../../services'; import { GetPreprintProvider, GetPreprintProviders, GetPreprintReviewActions, + GetPreprintSubmissionContributors, GetPreprintSubmissions, + GetPreprintWithdrawalSubmissionContributors, GetPreprintWithdrawalSubmissions, } from './preprint-moderation.actions'; import { PREPRINT_MODERATION_STATE_DEFAULTS, PreprintModerationStateModel } from './preprint-moderation.model'; @@ -26,6 +31,7 @@ import { PREPRINT_MODERATION_STATE_DEFAULTS, PreprintModerationStateModel } from @Injectable() export class PreprintModerationState { private readonly preprintModerationService = inject(PreprintModerationService); + private readonly contributorsService = inject(ContributorsService); @Action(GetPreprintProviders) getPreprintProviders(ctx: StateContext) { @@ -107,28 +113,6 @@ export class PreprintModerationState { ctx.setState(patch({ submissions: patch({ isLoading: true }) })); return this.preprintModerationService.getPreprintSubmissions(provider, status, page, sort).pipe( - switchMap((res) => { - if (!res.data.length) { - return of({ - ...res, - data: [], - }); - } - - const actionRequests = res.data.map((item) => - this.preprintModerationService.getPreprintSubmissionReviewAction(item.id) - ); - - return forkJoin(actionRequests).pipe( - map( - (actions) => - ({ - ...res, - data: res.data.map((item, i) => ({ ...item, actions: actions[i] })), - }) as PreprintSubmissionPaginatedData - ) - ); - }), tap((res) => { ctx.setState( patch({ @@ -156,28 +140,6 @@ export class PreprintModerationState { ctx.setState(patch({ withdrawalSubmissions: patch({ isLoading: true }) })); return this.preprintModerationService.getPreprintWithdrawalSubmissions(provider, status, page, sort).pipe( - switchMap((res) => { - if (!res.data.length) { - return of({ - ...res, - data: [], - }); - } - - const actionRequests = res.data.map((item) => - this.preprintModerationService.getPreprintWithdrawalSubmissionReviewAction(item.id) - ); - - return forkJoin(actionRequests).pipe( - map( - (actions) => - ({ - ...res, - data: res.data.map((item, i) => ({ ...item, actions: actions[i] })), - }) as PreprintWithdrawalPaginatedData - ) - ); - }), tap((res) => { ctx.setState( patch({ @@ -195,4 +157,122 @@ export class PreprintModerationState { catchError((error) => handleSectionError(ctx, 'withdrawalSubmissions', error)) ); } + + @Action(GetPreprintSubmissionContributors) + getPreprintSubmissionContributors( + ctx: StateContext, + { preprintId }: GetPreprintSubmissionContributors + ) { + const state = ctx.getState(); + const submission = state.submissions.data.find((s) => s.id === preprintId); + + if (submission?.contributors && submission.contributors.length > 0) { + return; + } + + ctx.setState( + patch({ + submissions: patch({ + data: updateItem( + (submission) => submission.id === preprintId, + patch({ contributorsLoading: true }) + ), + }), + }) + ); + + return this.contributorsService + .getAllContributors(ResourceType.Preprint, preprintId, 1, DEFAULT_TABLE_PARAMS.rows) + .pipe( + tap((res) => { + ctx.setState( + patch({ + submissions: patch({ + data: updateItem( + (submission) => submission.id === preprintId, + patch({ + contributors: res.data, + totalContributors: res.totalCount, + contributorsLoading: false, + }) + ), + }), + }) + ); + }), + catchError((error) => { + ctx.setState( + patch({ + submissions: patch({ + data: updateItem( + (submission) => submission.id === preprintId, + patch({ contributorsLoading: false }) + ), + }), + }) + ); + + return handleSectionError(ctx, 'submissions', error); + }) + ); + } + + @Action(GetPreprintWithdrawalSubmissionContributors) + getPreprintWithdrawalSubmissionContributors( + ctx: StateContext, + { submissionId, preprintId }: GetPreprintWithdrawalSubmissionContributors + ) { + const state = ctx.getState(); + const submission = state.withdrawalSubmissions.data.find((s) => s.id === submissionId); + + if (submission?.contributors && submission.contributors.length > 0) { + return; + } + + ctx.setState( + patch({ + withdrawalSubmissions: patch({ + data: updateItem( + (submission) => submission.id === submissionId, + patch({ contributorsLoading: true }) + ), + }), + }) + ); + + return this.contributorsService + .getAllContributors(ResourceType.Preprint, preprintId, 1, DEFAULT_TABLE_PARAMS.rows) + .pipe( + tap((res) => { + ctx.setState( + patch({ + withdrawalSubmissions: patch({ + data: updateItem( + (submission) => submission.id === submissionId, + patch({ + contributors: res.data, + totalContributors: res.totalCount, + contributorsLoading: false, + }) + ), + }), + }) + ); + }), + catchError((error) => { + ctx.setState( + patch({ + withdrawalSubmissions: patch({ + data: updateItem( + (submission) => submission.id === submissionId, + patch({ contributorsLoading: false }) + ), + }), + }) + ); + + return handleSectionError(ctx, 'withdrawalSubmissions', error); + }) + ); + } } diff --git a/src/testing/mocks/contributors.mock.ts b/src/testing/mocks/contributors.mock.ts index 6b7e92b08..ee62aae1e 100644 --- a/src/testing/mocks/contributors.mock.ts +++ b/src/testing/mocks/contributors.mock.ts @@ -13,8 +13,10 @@ export const MOCK_CONTRIBUTOR: ContributorModel = { permission: ContributorPermission.Read, isBibliographic: true, isCurator: false, + index: 0, education: [], employment: [], + deactivated: false, }; export const MOCK_CONTRIBUTOR_WITHOUT_HISTORY: ContributorModel = { @@ -28,6 +30,8 @@ export const MOCK_CONTRIBUTOR_WITHOUT_HISTORY: ContributorModel = { permission: ContributorPermission.Write, isBibliographic: false, isCurator: true, + index: 0, education: [], employment: [], + deactivated: false, }; diff --git a/src/testing/mocks/submission.mock.ts b/src/testing/mocks/submission.mock.ts index bc7a5b2a0..22bf9a0c1 100644 --- a/src/testing/mocks/submission.mock.ts +++ b/src/testing/mocks/submission.mock.ts @@ -1,7 +1,9 @@ -import { PreprintSubmission } from '@osf/features/moderation/models'; +import { PreprintSubmissionModel } from '@osf/features/moderation/models'; import { CollectionSubmissionWithGuid } from '@shared/models'; -export const MOCK_PREPRINT_SUBMISSION: PreprintSubmission = { +import { MOCK_CONTRIBUTOR } from './contributors.mock'; + +export const MOCK_PREPRINT_SUBMISSION: PreprintSubmissionModel = { id: '1', title: 'Test Preprint Submission', reviewsState: 'pending', @@ -20,6 +22,8 @@ export const MOCK_PREPRINT_SUBMISSION: PreprintSubmission = { comment: 'Test comment', }, ], + contributors: [MOCK_CONTRIBUTOR], + totalContributors: 1, }; export const MOCK_COLLECTION_SUBMISSION_WITH_GUID: CollectionSubmissionWithGuid = {