Skip to content

Commit 6ef6470

Browse files
committed
Merge branch 'release/25.1.0'
2 parents 3f64466 + 4dc8736 commit 6ef6470

File tree

85 files changed

+1033
-700
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+1033
-700
lines changed

src/app/features/analytics/components/view-linked-projects/view-linked-projects.component.spec.ts

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { MockComponents, MockProvider } from 'ng-mocks';
33
import { PaginatorState } from 'primeng/paginator';
44

55
import { ComponentFixture, TestBed } from '@angular/core/testing';
6-
import { ActivatedRoute, Router } from '@angular/router';
6+
import { ActivatedRoute } from '@angular/router';
77

88
import { ProjectOverviewSelectors } from '@osf/features/project/overview/store';
99
import { RegistryOverviewSelectors } from '@osf/features/registry/store/registry-overview';
1010
import { ResourceType } from '@osf/shared/enums';
11-
import { DuplicatesSelectors } from '@osf/shared/stores';
11+
import { LinkedProjectsSelectors } from '@osf/shared/stores/linked-projects';
1212
import {
1313
ContributorsListComponent,
1414
CustomPaginatorComponent,
@@ -17,27 +17,20 @@ import {
1717
SubHeaderComponent,
1818
TruncatedTextComponent,
1919
} from '@shared/components';
20-
import { MOCK_PROJECT_OVERVIEW } from '@shared/mocks';
21-
import { CustomDialogService } from '@shared/services';
2220

2321
import { ViewLinkedProjectsComponent } from './view-linked-projects.component';
2422

23+
import { MOCK_PROJECT_OVERVIEW } from '@testing/mocks';
2524
import { OSFTestingModule } from '@testing/osf.testing.module';
26-
import { CustomDialogServiceMockBuilder } from '@testing/providers/custom-dialog-provider.mock';
2725
import { ActivatedRouteMockBuilder } from '@testing/providers/route-provider.mock';
28-
import { RouterMockBuilder } from '@testing/providers/router-provider.mock';
2926
import { provideMockStore } from '@testing/providers/store-provider.mock';
3027

3128
describe('Component: View Duplicates', () => {
3229
let component: ViewLinkedProjectsComponent;
3330
let fixture: ComponentFixture<ViewLinkedProjectsComponent>;
34-
let routerMock: ReturnType<RouterMockBuilder['build']>;
3531
let activatedRouteMock: ReturnType<ActivatedRouteMockBuilder['build']>;
36-
let mockCustomDialogService: ReturnType<CustomDialogServiceMockBuilder['build']>;
3732

3833
beforeEach(async () => {
39-
mockCustomDialogService = CustomDialogServiceMockBuilder.create().build();
40-
routerMock = RouterMockBuilder.create().build();
4134
activatedRouteMock = ActivatedRouteMockBuilder.create()
4235
.withParams({ id: 'rid' })
4336
.withData({ resourceType: ResourceType.Project })
@@ -59,17 +52,13 @@ describe('Component: View Duplicates', () => {
5952
providers: [
6053
provideMockStore({
6154
signals: [
62-
{ selector: DuplicatesSelectors.getDuplicates, value: [] },
63-
{ selector: DuplicatesSelectors.getDuplicatesLoading, value: false },
64-
{ selector: DuplicatesSelectors.getDuplicatesTotalCount, value: 0 },
55+
{ selector: LinkedProjectsSelectors.getLinkedProjects, value: [] },
56+
{ selector: LinkedProjectsSelectors.getLinkedProjectsLoading, value: false },
57+
{ selector: LinkedProjectsSelectors.getLinkedProjectsTotalCount, value: 0 },
6558
{ selector: ProjectOverviewSelectors.getProject, value: MOCK_PROJECT_OVERVIEW },
66-
{ selector: ProjectOverviewSelectors.isProjectAnonymous, value: false },
6759
{ selector: RegistryOverviewSelectors.getRegistry, value: undefined },
68-
{ selector: RegistryOverviewSelectors.isRegistryAnonymous, value: false },
6960
],
7061
}),
71-
MockProvider(CustomDialogService, mockCustomDialogService),
72-
MockProvider(Router, routerMock),
7362
MockProvider(ActivatedRoute, activatedRouteMock),
7463
],
7564
}).compileComponents();

src/app/features/collections/components/collections-discover/collections-discover.component.html

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@
55
>
66
<div class="flex gap-3">
77
@let provider = collectionProvider();
8-
@if (provider && provider.brand) {
9-
<img class="collections-logo" alt="Collections Logo" height="64" [src]="provider.brand.heroLogoImageUrl" />
8+
9+
@if (provider && provider.assets) {
10+
<img
11+
class="collections-logo"
12+
alt="Collections Logo"
13+
height="80"
14+
[src]="provider.assets.squareColorNoTransparent"
15+
/>
1016
}
1117

1218
<h1 class="collections-heading flex align-items-center">{{ collectionProvider()?.name }}</h1>

src/app/features/institutions/pages/institutions-list/institutions-list.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@for (institution of institutions(); track $index) {
1919
<a class="dark-blue-link" [routerLink]="[institution.id]">
2020
<div class="border-1 border-round-xl grey-border-color px-5 py-4 flex align-items-center gap-4">
21-
<img class="fit-contain" [ngSrc]="institution.assets.logo" [alt]="'Logo'" width="60" height="60" />
21+
<img class="fit-contain" [ngSrc]="institution.assets.logo" [alt]="'Logo'" width="80" height="80" />
2222

2323
<h2>{{ institution.name }}</h2>
2424
</div>

src/app/features/institutions/pages/institutions-search/institutions-search.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<img
1010
[ngSrc]="institution().assets.logo"
1111
[alt]="institution().name"
12-
width="60"
13-
height="60"
12+
width="80"
13+
height="80"
1414
class="fit-contain"
1515
/>
1616

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,54 @@
1-
<div class="flex align-items-baseline gap-2 p-3">
2-
<osf-icon [class]="reviewStatusIcon[status()].value" [iconClass]="reviewStatusIcon[status()].icon"></osf-icon>
1+
<div class="resource">
2+
<p-accordion (onOpen)="handleOpen()">
3+
<p-accordion-panel value="0">
4+
<p-accordion-header class="flex flex-row align-items-start gap-3 p-3">
5+
<div osfStopPropagation class="flex align-items-baseline gap-2 font-normal">
6+
<osf-icon [class]="reviewStatusIcon[status()].value" [iconClass]="reviewStatusIcon[status()].icon"></osf-icon>
37

4-
<div>
5-
<p-button
6-
class="link-btn-no-padding"
7-
styleClass="text-left"
8-
link
9-
[label]="submission().title"
10-
(onClick)="selected.emit()"
11-
/>
8+
<div>
9+
<p-button
10+
class="link-btn-no-padding"
11+
styleClass="text-left"
12+
link
13+
[label]="submission().title"
14+
(onClick)="selected.emit()"
15+
/>
16+
@for (action of showAll ? submission().actions : submission().actions.slice(0, limitValue); track $index) {
17+
<div class="flex flex-wrap align-items-baseline gap-1 mt-2">
18+
<span>{{ actionLabel[action.toState] | translate }}</span>
19+
<span>{{ action.dateModified | dateAgo }}</span>
20+
<span>{{ 'moderation.submissionReview.by' | translate }}</span>
21+
<span>{{ action.creator?.name }}</span>
1222

13-
@for (action of showAll ? submission().actions : submission().actions.slice(0, limitValue); track $index) {
14-
<div class="flex flex-wrap gap-1 mt-2">
15-
<span>{{ actionLabel[action.toState] | translate }}</span>
16-
<span>{{ action.dateModified | dateAgo }}</span>
17-
<span>{{ 'moderation.submissionReview.by' | translate }}</span>
18-
<span>{{ action.creator?.name }}</span>
23+
@if (action.comment.length) {
24+
<osf-truncated-text class="font-italic" [text]="'- ' + action.comment" />
25+
}
26+
</div>
27+
}
1928

20-
@if (action.comment.length) {
21-
<osf-truncated-text class="font-italic" [text]="action.comment" />
22-
}
23-
</div>
24-
}
29+
@if (submission().actions.length > 1) {
30+
<p-button
31+
class="link-btn-no-padding block mt-2"
32+
[link]="true"
33+
[label]="(showAll ? 'common.buttons.hide' : 'moderation.showHistory') | translate"
34+
(onClick)="toggleHistory()"
35+
/>
36+
}
37+
</div>
38+
</div>
39+
</p-accordion-header>
2540

26-
@if (submission().actions.length > 1) {
27-
<p-button
28-
class="link-btn-no-padding block mt-2"
29-
[link]="true"
30-
[label]="(showAll ? 'common.buttons.hide' : 'moderation.showHistory') | translate"
31-
(onClick)="toggleHistory()"
32-
/>
33-
}
34-
</div>
41+
<p-accordion-content>
42+
<div class="flex align-items-center gap-1 p-3 pt-0 ml-3">
43+
<p>{{ 'common.labels.contributors' | translate }}:</p>
44+
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+
}
50+
</div>
51+
</p-accordion-content>
52+
</p-accordion-panel>
53+
</p-accordion>
3554
</div>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { MockComponents, MockPipes } from 'ng-mocks';
33

44
import { ComponentFixture, TestBed } from '@angular/core/testing';
55

6-
import { IconComponent } from '@osf/shared/components';
6+
import { ContributorsListComponent, IconComponent } from '@osf/shared/components';
77
import { DateAgoPipe } from '@osf/shared/pipes';
88

99
import { SubmissionReviewStatus } from '../../enums';
10-
import { PreprintSubmission } from '../../models';
10+
import { PreprintSubmissionModel } from '../../models';
1111

1212
import { PreprintSubmissionItemComponent } from './preprint-submission-item.component';
1313

@@ -18,14 +18,14 @@ describe('PreprintSubmissionItemComponent', () => {
1818
let component: PreprintSubmissionItemComponent;
1919
let fixture: ComponentFixture<PreprintSubmissionItemComponent>;
2020

21-
const mockSubmission: PreprintSubmission = MOCK_PREPRINT_SUBMISSION;
21+
const mockSubmission: PreprintSubmissionModel = MOCK_PREPRINT_SUBMISSION;
2222

2323
beforeEach(async () => {
2424
await TestBed.configureTestingModule({
2525
imports: [
2626
PreprintSubmissionItemComponent,
2727
OSFTestingModule,
28-
...MockComponents(IconComponent),
28+
...MockComponents(IconComponent, ContributorsListComponent),
2929
MockPipes(DateAgoPipe, TranslatePipe),
3030
],
3131
}).compileComponents();
Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
11
import { TranslatePipe } from '@ngx-translate/core';
22

3+
import { Accordion, AccordionContent, AccordionHeader, AccordionPanel } from 'primeng/accordion';
34
import { Button } from 'primeng/button';
5+
import { Skeleton } from 'primeng/skeleton';
46

57
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
68

7-
import { IconComponent, TruncatedTextComponent } from '@osf/shared/components';
9+
import { ContributorsListComponent, IconComponent, TruncatedTextComponent } from '@osf/shared/components';
10+
import { StopPropagationDirective } from '@osf/shared/directives';
811
import { DateAgoPipe } from '@osf/shared/pipes';
912

1013
import { PREPRINT_ACTION_LABEL, ReviewStatusIcon } from '../../constants';
1114
import { ActionStatus, SubmissionReviewStatus } from '../../enums';
12-
import { PreprintSubmission, PreprintWithdrawalSubmission } from '../../models';
15+
import { PreprintSubmissionModel, PreprintWithdrawalSubmission } from '../../models';
1316

1417
@Component({
1518
selector: 'osf-preprint-submission-item',
16-
imports: [IconComponent, DateAgoPipe, Button, TranslatePipe, TruncatedTextComponent],
19+
imports: [
20+
IconComponent,
21+
DateAgoPipe,
22+
Button,
23+
TranslatePipe,
24+
TruncatedTextComponent,
25+
Accordion,
26+
AccordionPanel,
27+
AccordionHeader,
28+
AccordionContent,
29+
ContributorsListComponent,
30+
Skeleton,
31+
StopPropagationDirective,
32+
],
1733
templateUrl: './preprint-submission-item.component.html',
1834
styleUrl: './preprint-submission-item.component.scss',
1935
changeDetection: ChangeDetectionStrategy.OnPush,
2036
})
2137
export class PreprintSubmissionItemComponent {
2238
status = input.required<SubmissionReviewStatus>();
23-
submission = input.required<PreprintSubmission | PreprintWithdrawalSubmission>();
39+
submission = input.required<PreprintSubmissionModel | PreprintWithdrawalSubmission>();
2440
selected = output<void>();
41+
loadContributors = output<void>();
2542

2643
readonly reviewStatusIcon = ReviewStatusIcon;
2744
readonly actionLabel = PREPRINT_ACTION_LABEL;
@@ -33,4 +50,8 @@ export class PreprintSubmissionItemComponent {
3350
toggleHistory() {
3451
this.showAll = !this.showAll;
3552
}
53+
54+
handleOpen() {
55+
this.loadContributors.emit();
56+
}
3657
}

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
@@ -40,6 +40,7 @@
4040
[submission]="item"
4141
[status]="selectedReviewOption()"
4242
(selected)="navigateToPreprint(item)"
43+
(loadContributors)="loadContributors(item)"
4344
></osf-preprint-submission-item>
4445
</div>
4546
}

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ import {
2424
} from '@osf/shared/components';
2525
import { Primitive } from '@osf/shared/helpers';
2626

27-
import { PreprintSubmission } from '../../models';
28-
import { GetPreprintSubmissions, PreprintModerationSelectors } from '../../store/preprint-moderation';
27+
import { PreprintSubmissionModel } from '../../models';
28+
import {
29+
GetPreprintSubmissionContributors,
30+
GetPreprintSubmissions,
31+
PreprintModerationSelectors,
32+
} from '../../store/preprint-moderation';
2933

3034
@Component({
3135
selector: 'osf-preprint-submissions',
@@ -53,7 +57,10 @@ export class PreprintSubmissionsComponent implements OnInit {
5357
this.route.parent?.params.pipe(map((params) => params['providerId'])) ?? of(undefined)
5458
);
5559

56-
readonly actions = createDispatchMap({ getPreprintSubmissions: GetPreprintSubmissions });
60+
readonly actions = createDispatchMap({
61+
getPreprintSubmissions: GetPreprintSubmissions,
62+
getPreprintSubmissionContributors: GetPreprintSubmissionContributors,
63+
});
5764

5865
readonly submissions = select(PreprintModerationSelectors.getPreprintSubmissions);
5966
readonly isLoading = select(PreprintModerationSelectors.arePreprintSubmissionsLoading);
@@ -112,14 +119,18 @@ export class PreprintSubmissionsComponent implements OnInit {
112119
this.fetchSubmissions();
113120
}
114121

115-
navigateToPreprint(item: PreprintSubmission) {
122+
navigateToPreprint(item: PreprintSubmissionModel) {
116123
const url = this.router.serializeUrl(
117124
this.router.createUrlTree(['/preprints/', this.providerId(), item.id], { queryParams: { mode: 'moderator' } })
118125
);
119126

120127
window.open(url, '_blank');
121128
}
122129

130+
loadContributors(item: PreprintSubmissionModel) {
131+
this.actions.getPreprintSubmissionContributors(item.id);
132+
}
133+
123134
private getStatusFromQueryParams() {
124135
const queryParams = this.route.snapshot.queryParams;
125136
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
@@ -40,6 +40,7 @@
4040
[submission]="item"
4141
[status]="selectedReviewOption()"
4242
(selected)="navigateToPreprint(item)"
43+
(loadContributors)="loadContributors(item)"
4344
></osf-preprint-submission-item>
4445
</div>
4546
}

0 commit comments

Comments
 (0)