Skip to content

Commit 82e0f25

Browse files
committed
feat(preprint-details): Implemented and used tombstone component for withdrawn state
1 parent eebcf30 commit 82e0f25

10 files changed

Lines changed: 238 additions & 18 deletions

File tree

src/app/features/preprints/components/preprint-details/additional-info/additional-info.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ <h3>{{ 'preprints.preprintStepper.review.sections.metadata.license' | translate
2828
<p class="font-normal">{{ license()!.name }}</p>
2929
</p-accordion-header>
3030
<p-accordion-content>
31-
<p>{{ license()!.text | interpolate: licenseOptionsRecord() }}</p>
31+
<p class="white-space-pre-line">{{ license()!.text | interpolate: licenseOptionsRecord() }}</p>
3232
</p-accordion-content>
3333
</p-accordion-panel>
3434
</p-accordion>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.white-space-pre-line {
2+
white-space: pre-line;
3+
}

src/app/features/preprints/components/preprint-details/additional-info/additional-info.component.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ import { ChangeDetectionStrategy, Component, computed, effect } from '@angular/c
1212

1313
import { CitationSectionComponent } from '@osf/features/preprints/components/preprint-details/citation-section/citation-section.component';
1414
import { PreprintSelectors } from '@osf/features/preprints/store/preprint';
15-
import { FetchLicenses, FetchPreprintProject, SubmitPreprint } from '@osf/features/preprints/store/preprint-stepper';
1615
import { ResourceType } from '@shared/enums';
1716
import { InterpolatePipe } from '@shared/pipes';
18-
import { FetchSelectedSubjects, GetAllContributors, SubjectsSelectors } from '@shared/stores';
17+
import { FetchSelectedSubjects, SubjectsSelectors } from '@shared/stores';
1918

2019
@Component({
2120
selector: 'osf-preprint-additional-info',
@@ -38,11 +37,7 @@ import { FetchSelectedSubjects, GetAllContributors, SubjectsSelectors } from '@s
3837
})
3938
export class AdditionalInfoComponent {
4039
private actions = createDispatchMap({
41-
getContributors: GetAllContributors,
4240
fetchSubjects: FetchSelectedSubjects,
43-
fetchLicenses: FetchLicenses,
44-
fetchPreprintProject: FetchPreprintProject,
45-
submitPreprint: SubmitPreprint,
4641
});
4742

4843
preprint = select(PreprintSelectors.getPreprint);
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<p-card>
2+
@if (preprint()) {
3+
@let preprintValue = preprint()!;
4+
<div class="flex flex-column gap-4">
5+
<section class="flex flex-column gap-2">
6+
<h3>{{ 'preprints.preprintStepper.review.sections.metadata.authors' | translate }}</h3>
7+
8+
<div class="flex flex-column gap-1 line-height-2 md:flex-row">
9+
@for (contributor of bibliographicContributors(); track contributor.id) {
10+
<div>
11+
<a class="font-bold"> {{ contributor.fullName }}</a>
12+
<span>{{ $last ? '' : ',' }}</span>
13+
</div>
14+
}
15+
16+
@if (areContributorsLoading()) {
17+
<p-skeleton width="10rem" height="1.25rem" />
18+
}
19+
</div>
20+
</section>
21+
22+
<section class="flex flex-column gap-2">
23+
<h3>{{ 'preprints.preprintStepper.common.labels.abstract' | translate }}</h3>
24+
<osf-truncated-text [maxVisibleLines]="2" [text]="preprintValue.description" />
25+
</section>
26+
27+
<osf-preprint-doi-section [preprintProvider]="preprintProvider()" />
28+
29+
<section class="license flex flex-column gap-2">
30+
<h3>{{ 'preprints.preprintStepper.review.sections.metadata.license' | translate }}</h3>
31+
32+
<!-- [RNi] TODO: Extract to separate component -->
33+
<p-accordion>
34+
<p-accordion-panel value="0">
35+
<p-accordion-header class="p-0 justify-content-start gap-2">
36+
<p class="font-normal">{{ license()!.name }}</p>
37+
</p-accordion-header>
38+
<p-accordion-content>
39+
<p class="white-space-pre-line">{{ license()!.text | interpolate: licenseOptionsRecord() }}</p>
40+
</p-accordion-content>
41+
</p-accordion-panel>
42+
</p-accordion>
43+
</section>
44+
45+
<section class="flex flex-row gap-4">
46+
<div class="flex flex-column gap-2">
47+
<h3>{{ 'common.labels.dateCreated' | translate }}</h3>
48+
<p>{{ preprintValue.dateCreated | date: 'MMM d, y, hh:mm a' }}</p>
49+
</div>
50+
<div class="flex flex-column gap-2">
51+
<h3>{{ 'common.labels.dateUpdated' | translate }}</h3>
52+
<p>{{ preprintValue.dateModified | date: 'MMM d, y, hh:mm a' }}</p>
53+
</div>
54+
</section>
55+
56+
<section class="flex flex-column gap-2">
57+
<h3>{{ 'preprints.preprintStepper.review.sections.metadata.subjects' | translate }}</h3>
58+
59+
<div class="flex flex-wrap gap-2">
60+
@for (subject of subjects(); track subject.id) {
61+
<p-tag [value]="subject.name" severity="info" />
62+
}
63+
64+
@if (areSelectedSubjectsLoading()) {
65+
<p-skeleton width="10rem" height="1.7rem" />
66+
}
67+
</div>
68+
</section>
69+
70+
<section class="flex flex-column gap-2">
71+
<h3>{{ 'preprints.preprintStepper.review.sections.metadata.tags' | translate }}</h3>
72+
73+
<div class="flex flex-wrap gap-2">
74+
@for (tag of preprintValue.tags; track tag) {
75+
<p-tag [value]="tag" severity="info" />
76+
} @empty {
77+
<p>{{ 'common.labels.none' | translate }}</p>
78+
}
79+
</div>
80+
</section>
81+
</div>
82+
}
83+
84+
@if (isPreprintLoading()) {
85+
<div class="flex flex-column gap-4">
86+
@for (i of skeletonData; track $index) {
87+
<section class="flex flex-column gap-2">
88+
<p-skeleton width="5rem" height="1.3rem" />
89+
<p-skeleton width="25rem" height="5rem" />
90+
</section>
91+
}
92+
</div>
93+
}
94+
</p-card>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.white-space-pre-line {
2+
white-space: pre-line;
3+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { PreprintTombstoneComponent } from './preprint-tombstone.component';
4+
5+
describe.skip('PreprintTombstoneComponent', () => {
6+
let component: PreprintTombstoneComponent;
7+
let fixture: ComponentFixture<PreprintTombstoneComponent>;
8+
9+
beforeEach(async () => {
10+
await TestBed.configureTestingModule({
11+
imports: [PreprintTombstoneComponent],
12+
}).compileComponents();
13+
14+
fixture = TestBed.createComponent(PreprintTombstoneComponent);
15+
component = fixture.componentInstance;
16+
fixture.detectChanges();
17+
});
18+
19+
it('should create', () => {
20+
expect(component).toBeTruthy();
21+
});
22+
});
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { createDispatchMap, select } from '@ngxs/store';
2+
3+
import { TranslatePipe } from '@ngx-translate/core';
4+
5+
import { Accordion, AccordionContent, AccordionHeader, AccordionPanel } from 'primeng/accordion';
6+
import { Card } from 'primeng/card';
7+
import { Skeleton } from 'primeng/skeleton';
8+
import { Tag } from 'primeng/tag';
9+
10+
import { DatePipe } from '@angular/common';
11+
import { ChangeDetectionStrategy, Component, computed, effect, input, OnDestroy } from '@angular/core';
12+
13+
import { PreprintDoiSectionComponent } from '@osf/features/preprints/components/preprint-details/preprint-doi-section/preprint-doi-section.component';
14+
import { ApplicabilityStatus, PreregLinkInfo } from '@osf/features/preprints/enums';
15+
import { PreprintProviderDetails } from '@osf/features/preprints/models';
16+
import { FetchPreprintById, PreprintSelectors } from '@osf/features/preprints/store/preprint';
17+
import { TruncatedTextComponent } from '@shared/components';
18+
import { ResourceType } from '@shared/enums';
19+
import { InterpolatePipe } from '@shared/pipes';
20+
import {
21+
ContributorsSelectors,
22+
FetchSelectedSubjects,
23+
GetAllContributors,
24+
ResetContributorsState,
25+
SubjectsSelectors,
26+
} from '@shared/stores';
27+
28+
@Component({
29+
selector: 'osf-preprint-tombstone',
30+
imports: [
31+
Card,
32+
PreprintDoiSectionComponent,
33+
Skeleton,
34+
TranslatePipe,
35+
TruncatedTextComponent,
36+
Accordion,
37+
AccordionContent,
38+
Tag,
39+
AccordionPanel,
40+
AccordionHeader,
41+
InterpolatePipe,
42+
DatePipe,
43+
],
44+
templateUrl: './preprint-tombstone.component.html',
45+
styleUrl: './preprint-tombstone.component.scss',
46+
changeDetection: ChangeDetectionStrategy.OnPush,
47+
})
48+
export class PreprintTombstoneComponent implements OnDestroy {
49+
readonly ApplicabilityStatus = ApplicabilityStatus;
50+
readonly PreregLinkInfo = PreregLinkInfo;
51+
52+
private actions = createDispatchMap({
53+
getContributors: GetAllContributors,
54+
resetContributorsState: ResetContributorsState,
55+
fetchPreprintById: FetchPreprintById,
56+
fetchSubjects: FetchSelectedSubjects,
57+
});
58+
preprintProvider = input.required<PreprintProviderDetails | undefined>();
59+
60+
preprint = select(PreprintSelectors.getPreprint);
61+
isPreprintLoading = select(PreprintSelectors.isPreprintLoading);
62+
63+
contributors = select(ContributorsSelectors.getContributors);
64+
areContributorsLoading = select(ContributorsSelectors.isContributorsLoading);
65+
bibliographicContributors = computed(() => {
66+
return this.contributors().filter((contributor) => contributor.isBibliographic);
67+
});
68+
subjects = select(SubjectsSelectors.getSelectedSubjects);
69+
areSelectedSubjectsLoading = select(SubjectsSelectors.areSelectedSubjectsLoading);
70+
71+
license = computed(() => {
72+
const preprint = this.preprint();
73+
if (!preprint) return null;
74+
return preprint.embeddedLicense;
75+
});
76+
licenseOptionsRecord = computed(() => {
77+
return (this.preprint()?.licenseOptions ?? {}) as Record<string, string>;
78+
});
79+
80+
skeletonData = Array.from({ length: 6 }, () => null);
81+
82+
constructor() {
83+
effect(() => {
84+
const preprint = this.preprint();
85+
if (!preprint) return;
86+
87+
this.actions.getContributors(this.preprint()!.id, ResourceType.Preprint);
88+
this.actions.fetchSubjects(this.preprint()!.id, ResourceType.Preprint);
89+
});
90+
}
91+
92+
ngOnDestroy(): void {
93+
this.actions.resetContributorsState();
94+
}
95+
}

src/app/features/preprints/pages/preprint-details/preprint-details.component.html

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,20 @@ <h1>{{ preprint()!.title }}</h1>
5555
/>
5656
}
5757

58-
<section class="flex-1 flex flex-column gap-4 align-items-start lg:flex-row">
59-
<section class="w-12 lg:w-6">
60-
<osf-preprint-file-section [providerReviewsWorkflow]="preprintProvider()?.reviewsWorkflow || null" />
61-
</section>
58+
@if (!preprint()?.dateWithdrawn) {
59+
<section class="flex-1 flex flex-column gap-4 align-items-start lg:flex-row">
60+
<section class="w-12 lg:w-6">
61+
<osf-preprint-file-section [providerReviewsWorkflow]="preprintProvider()?.reviewsWorkflow || null" />
62+
</section>
6263

63-
<section class="flex flex-column gap-4 w-12 lg:w-6">
64-
<osf-preprint-share-and-download [preprintProvider]="preprintProvider()" />
65-
<osf-preprint-general-information [preprintProvider]="preprintProvider()" />
66-
<osf-preprint-additional-info />
64+
<section class="flex flex-column gap-4 w-12 lg:w-6">
65+
<osf-preprint-share-and-download [preprintProvider]="preprintProvider()" />
66+
<osf-preprint-general-information [preprintProvider]="preprintProvider()" />
67+
<osf-preprint-additional-info />
68+
</section>
6769
</section>
68-
</section>
70+
} @else {
71+
<osf-preprint-tombstone [preprintProvider]="preprintProvider()" class="lg:w-6" />
72+
}
6973
</section>
7074
</div>

src/app/features/preprints/pages/preprint-details/preprint-details.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
StatusBannerComponent,
3131
WithdrawDialogComponent,
3232
} from '@osf/features/preprints/components';
33+
import { PreprintTombstoneComponent } from '@osf/features/preprints/components/preprint-details/preprint-tombstone/preprint-tombstone.component';
3334
import { PreprintRequestMachineState, ProviderReviewsWorkflow, ReviewsState } from '@osf/features/preprints/enums';
3435
import {
3536
FetchPreprintById,
@@ -56,6 +57,7 @@ import { IS_MEDIUM } from '@shared/utils';
5657
AdditionalInfoComponent,
5758
StatusBannerComponent,
5859
TranslatePipe,
60+
PreprintTombstoneComponent,
5961
],
6062
templateUrl: './preprint-details.component.html',
6163
styleUrl: './preprint-details.component.scss',

src/assets/i18n/en.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@
9999
"learnMore": "Learn More",
100100
"and": "and",
101101
"more": "more",
102-
"data": "Data"
102+
"data": "Data",
103+
"dateUpdated": "Date Updated",
104+
"dateCreated": "Date Created"
103105
},
104106
"deleteConfirmation": {
105107
"header": "Delete",
@@ -1927,7 +1929,7 @@
19271929
"metadata": {
19281930
"title": "Metadata",
19291931
"contributors": "Contributors",
1930-
"authors": "Contributors",
1932+
"authors": "Authors",
19311933
"affiliatedInstitutions": "Affiliated Institutions",
19321934
"license": "License",
19331935
"publicationDoi": "Publication DOI",

0 commit comments

Comments
 (0)