Skip to content

Commit c59579f

Browse files
committed
get contributors for collections moderation cards
1 parent dec5cde commit c59579f

File tree

7 files changed

+141
-5
lines changed

7 files changed

+141
-5
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<span class="mx-1 flex align-items-start">|</span>
4343
}
4444
<p class="font-normal">
45-
<span class="font-bold">{{ attribute.label }}:</span> {{ attribute.value }}
45+
<span class="font-bold">test {{ attribute.label }}:</span> {{ attribute.value }}
4646
</p>
4747
}
4848
</div>

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

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

55
import { Button } from 'primeng/button';
66

7-
import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
7+
import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';
88
import { ActivatedRoute, Router } from '@angular/router';
99

1010
import { collectionFilterNames } from '@osf/features/collections/constants';
@@ -29,7 +29,8 @@ export class CollectionSubmissionItemComponent {
2929
private activatedRoute = inject(ActivatedRoute);
3030

3131
submission = input.required<CollectionSubmissionWithGuid>();
32-
32+
loadContributors = output<void>();
33+
loadMoreContributors = output<void>();
3334
collectionProvider = select(CollectionsSelectors.getCollectionProvider);
3435

3536
readonly reviewStatusIcon = ReviewStatusIcon;

src/app/features/moderation/components/collection-submissions-list/collection-submissions-list.component.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
<div class="submission-container mt-5">
33
@for (item of submissions(); track $index) {
44
<div class="submission-item">
5-
<osf-submission-item [submission]="item"></osf-submission-item>
5+
<osf-submission-item
6+
[submission]="item"
7+
(loadContributors)="loadContributors(item)"
8+
(loadMoreContributors)="loadMoreContributors(item)"
9+
>
10+
</osf-submission-item>
611
</div>
712
}
813
</div>

src/app/features/moderation/components/collection-submissions-list/collection-submissions-list.component.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
import { select } from '@ngxs/store';
1+
import { createDispatchMap, select } from '@ngxs/store';
22

33
import { TranslatePipe } from '@ngx-translate/core';
44

55
import { ChangeDetectionStrategy, Component } from '@angular/core';
66

7+
import {
8+
GetCollectionSubmissionContributors,
9+
LoadMoreCollectionSubmissionContributors,
10+
} from '@osf/features/moderation/store/collections-moderation';
11+
import { CollectionSubmissionWithGuid } from '@shared/models/collections/collections.models';
12+
713
import { CollectionsModerationSelectors } from '../../store/collections-moderation';
814
import { CollectionSubmissionItemComponent } from '../collection-submission-item/collection-submission-item.component';
915

@@ -16,4 +22,17 @@ import { CollectionSubmissionItemComponent } from '../collection-submission-item
1622
})
1723
export class CollectionSubmissionsListComponent {
1824
submissions = select(CollectionsModerationSelectors.getCollectionSubmissions);
25+
26+
readonly actions = createDispatchMap({
27+
getCollectionSubmissionContributors: GetCollectionSubmissionContributors,
28+
loadMoreCollectionSubmissionContributors: LoadMoreCollectionSubmissionContributors,
29+
});
30+
31+
loadContributors(item: CollectionSubmissionWithGuid) {
32+
this.actions.getCollectionSubmissionContributors(item.id, 1);
33+
}
34+
35+
loadMoreContributors(item: CollectionSubmissionWithGuid) {
36+
this.actions.loadMoreCollectionSubmissionContributors(item.id);
37+
}
1938
}

src/app/features/moderation/store/collections-moderation/collections-moderation.actions.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,18 @@ export class CreateCollectionSubmissionAction {
2929
export class ClearCollectionModeration {
3030
static readonly type = '[Collections Moderation] ClearCollectionModeration';
3131
}
32+
33+
export class GetCollectionSubmissionContributors {
34+
static readonly type = `[Collections Moderation] Get Registry Submission Contributors`;
35+
36+
constructor(
37+
public collectionId: string,
38+
public page = 1
39+
) {}
40+
}
41+
42+
export class LoadMoreCollectionSubmissionContributors {
43+
static readonly type = `[Collections Moderation] Load More Collection Submission Contributors`;
44+
45+
constructor(public collectionId: string) {}
46+
}

src/app/features/moderation/store/collections-moderation/collections-moderation.state.ts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,33 @@ import { catchError, forkJoin, map, of, switchMap, tap } from 'rxjs';
66
import { inject, Injectable } from '@angular/core';
77

88
import { CollectionsService } from '@osf/shared/services/collections.service';
9+
import { DEFAULT_TABLE_PARAMS } from '@shared/constants/default-table-params.constants';
10+
import { ResourceType } from '@shared/enums/resource-type.enum';
911
import { handleSectionError } from '@shared/helpers/state-error.handler';
12+
import { ContributorsService } from '@shared/services/contributors.service';
1013

1114
import {
1215
ClearCollectionModeration,
1316
CreateCollectionSubmissionAction,
17+
GetCollectionSubmissionContributors,
1418
GetCollectionSubmissions,
1519
GetSubmissionsReviewActions,
20+
LoadMoreCollectionSubmissionContributors,
1621
} from './collections-moderation.actions';
1722
import { COLLECTIONS_MODERATION_STATE_DEFAULTS, CollectionsModerationStateModel } from './collections-moderation.model';
1823

24+
// import { CollectionSubmissionWithGuid } from '@shared/services/collections.services/models';
25+
// 'models/collections/collections.models';
26+
// import { CollectionSubmissionWithGuid } from '@shared/services/collections.services/models';
27+
1928
@State<CollectionsModerationStateModel>({
2029
name: 'collectionsModeration',
2130
defaults: COLLECTIONS_MODERATION_STATE_DEFAULTS,
2231
})
2332
@Injectable()
2433
export class CollectionsModerationState {
2534
collectionsService = inject(CollectionsService);
35+
contributorsService = inject(ContributorsService);
2636

2737
@Action(GetCollectionSubmissions)
2838
getCollectionSubmissions(ctx: StateContext<CollectionsModerationStateModel>, action: GetCollectionSubmissions) {
@@ -117,4 +127,87 @@ export class CollectionsModerationState {
117127
clearCollectionModeration(ctx: StateContext<CollectionsModerationStateModel>) {
118128
ctx.setState(COLLECTIONS_MODERATION_STATE_DEFAULTS);
119129
}
130+
131+
@Action(GetCollectionSubmissionContributors)
132+
getCollectionSubmissionContributors(
133+
ctx: StateContext<CollectionsModerationStateModel>,
134+
action: GetCollectionSubmissionContributors
135+
) {
136+
const state = ctx.getState();
137+
const submission = state.collectionSubmissions.data.find((s) => s.id === action.collectionId);
138+
139+
if (submission?.contributors && submission.contributors.length > 0 && action.page === 1) {
140+
return;
141+
}
142+
143+
ctx.setState(
144+
patch({
145+
collectionSubmissions: {
146+
...state.collectionSubmissions,
147+
isSubmitting: true,
148+
},
149+
})
150+
);
151+
152+
return this.contributorsService
153+
.getBibliographicContributors(
154+
ResourceType.Collection,
155+
action.collectionId,
156+
action.page,
157+
DEFAULT_TABLE_PARAMS.rows
158+
)
159+
.pipe(
160+
tap((res) => {
161+
const currentSubmission = state.collectionSubmissions.data.find((s) => s.id === action.collectionId);
162+
const existingContributors = currentSubmission?.contributors || [];
163+
const newContributors = action.page === 1 ? res.data : [...existingContributors, ...res.data];
164+
165+
ctx.patchState({
166+
collectionSubmissions: {
167+
...state.collectionSubmissions,
168+
data: state.collectionSubmissions.data.map((submission) =>
169+
submission.id === action.collectionId
170+
? {
171+
...submission,
172+
contributors: newContributors,
173+
totalContributors: res.totalCount,
174+
contributorsLoading: false,
175+
contributorsPage: action.page,
176+
}
177+
: submission
178+
),
179+
},
180+
});
181+
}),
182+
catchError((error) => {
183+
ctx.patchState({
184+
collectionSubmissions: {
185+
...state.collectionSubmissions,
186+
data: state.collectionSubmissions.data.map((submission) =>
187+
submission.id === action.collectionId
188+
? {
189+
...submission,
190+
contributorsLoading: false,
191+
}
192+
: submission
193+
),
194+
},
195+
});
196+
return handleSectionError(ctx, 'collectionSubmissions', error);
197+
})
198+
);
199+
}
200+
201+
@Action(LoadMoreCollectionSubmissionContributors)
202+
loadMoreCollectionSubmissionContributors(
203+
ctx: StateContext<CollectionsModerationStateModel>,
204+
action: LoadMoreCollectionSubmissionContributors
205+
) {
206+
const state = ctx.getState();
207+
const submission = state.collectionSubmissions.data.find((s) => s.id === action.collectionId);
208+
const currentPage = submission?.contributorsPage || 1;
209+
const nextPage = currentPage + 1;
210+
211+
return ctx.dispatch(new GetCollectionSubmissionContributors(action.collectionId, nextPage));
212+
}
120213
}

src/app/shared/models/collections/collections.models.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ export interface CollectionSubmissionWithGuid {
8989
fullName: string;
9090
};
9191
actions?: CollectionSubmissionReviewAction[];
92+
totalContributors?: number;
93+
contributorsLoading?: boolean;
94+
contributorsPage?: number;
9295
}
9396

9497
export type CollectionSubmissionActionType = 'collection_submission_actions';

0 commit comments

Comments
 (0)