From 899044888745633a47906f45bb52b705a2dc2106 Mon Sep 17 00:00:00 2001 From: Roma Date: Tue, 27 May 2025 18:22:16 +0300 Subject: [PATCH 01/11] feat(preprints-overview): Designed preprints overview page --- src/app/app.routes.ts | 5 ++ src/app/core/constants/nav-items.constant.ts | 6 ++ .../forgot-password.component.scss | 2 +- .../reset-password.component.scss | 2 +- .../auth/pages/sign-up/sign-up.component.scss | 2 +- .../advisory-group.component.html | 18 ++++++ .../advisory-group.component.scss | 0 .../advisory-group.component.spec.ts | 22 ++++++++ .../advisory-group.component.ts | 10 ++++ .../browse-by-subjects.component.html | 17 ++++++ .../browse-by-subjects.component.scss | 0 .../browse-by-subjects.component.spec.ts | 22 ++++++++ .../browse-by-subjects.component.ts | 12 ++++ .../features/preprints/components/index.ts | 3 + .../preprint-services.component.html | 8 +++ .../preprint-services.component.scss | 3 + .../preprint-services.component.spec.ts | 22 ++++++++ .../preprint-services.component.ts | 10 ++++ .../preprints/constants/preprints.routes.ts | 24 ++++++++ src/app/features/preprints/pages/index.ts | 1 + .../landing/preprints-landing.component.html | 52 ++++++++++++++++++ .../landing/preprints-landing.component.scss | 14 +++++ .../preprints-landing.component.spec.ts | 22 ++++++++ .../landing/preprints-landing.component.ts | 35 ++++++++++++ .../preprints/preprints.component.html | 3 + .../preprints/preprints.component.scss | 7 +++ .../preprints/preprints.component.spec.ts | 22 ++++++++ .../features/preprints/preprints.component.ts | 17 ++++++ src/assets/i18n/en.json | 1 + ...-background.png => dark-blue-gradient.png} | Bin .../preprints-services-background.png | Bin 0 -> 99416 bytes src/assets/styles/overrides/button.scss | 9 +++ 32 files changed, 368 insertions(+), 3 deletions(-) create mode 100644 src/app/features/preprints/components/advisory-group/advisory-group.component.html create mode 100644 src/app/features/preprints/components/advisory-group/advisory-group.component.scss create mode 100644 src/app/features/preprints/components/advisory-group/advisory-group.component.spec.ts create mode 100644 src/app/features/preprints/components/advisory-group/advisory-group.component.ts create mode 100644 src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html create mode 100644 src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss create mode 100644 src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.spec.ts create mode 100644 src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts create mode 100644 src/app/features/preprints/components/index.ts create mode 100644 src/app/features/preprints/components/preprint-services/preprint-services.component.html create mode 100644 src/app/features/preprints/components/preprint-services/preprint-services.component.scss create mode 100644 src/app/features/preprints/components/preprint-services/preprint-services.component.spec.ts create mode 100644 src/app/features/preprints/components/preprint-services/preprint-services.component.ts create mode 100644 src/app/features/preprints/constants/preprints.routes.ts create mode 100644 src/app/features/preprints/pages/index.ts create mode 100644 src/app/features/preprints/pages/landing/preprints-landing.component.html create mode 100644 src/app/features/preprints/pages/landing/preprints-landing.component.scss create mode 100644 src/app/features/preprints/pages/landing/preprints-landing.component.spec.ts create mode 100644 src/app/features/preprints/pages/landing/preprints-landing.component.ts create mode 100644 src/app/features/preprints/preprints.component.html create mode 100644 src/app/features/preprints/preprints.component.scss create mode 100644 src/app/features/preprints/preprints.component.spec.ts create mode 100644 src/app/features/preprints/preprints.component.ts rename src/assets/images/{auth-background.png => dark-blue-gradient.png} (100%) create mode 100644 src/assets/images/preprints/preprints-services-background.png diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index adbad36dd..71073dad3 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -159,6 +159,11 @@ export const routes: Routes = [ path: 'settings', loadChildren: () => import('./features/settings/settings.routes').then((mod) => mod.settingsRoutes), }, + { + path: 'preprints', + loadChildren: () => + import('./features/preprints/constants/preprints.routes').then((mod) => mod.preprintsRoutes), + }, { path: 'search', loadComponent: () => import('./features/search/search.component').then((mod) => mod.SearchComponent), diff --git a/src/app/core/constants/nav-items.constant.ts b/src/app/core/constants/nav-items.constant.ts index c3c68d64f..9fabf8d12 100644 --- a/src/app/core/constants/nav-items.constant.ts +++ b/src/app/core/constants/nav-items.constant.ts @@ -28,6 +28,12 @@ export const NAV_ITEMS: NavItem[] = [ icon: 'my-projects', useExactMatch: true, }, + { + path: '/preprints', + label: 'navigation.preprints', + icon: 'preprints', + useExactMatch: true, + }, { path: '/my-profile', label: 'navigation.profile', diff --git a/src/app/features/auth/pages/forgot-password/forgot-password.component.scss b/src/app/features/auth/pages/forgot-password/forgot-password.component.scss index 3481b9ff6..6926c3fb8 100644 --- a/src/app/features/auth/pages/forgot-password/forgot-password.component.scss +++ b/src/app/features/auth/pages/forgot-password/forgot-password.component.scss @@ -4,7 +4,7 @@ :host { @include mix.flex-center; flex: 1; - background: url("/assets/images/auth-background.png") center no-repeat; + background: url("/assets/images/dark-blue-gradient.png") center no-repeat; background-size: cover; .forgot-password-container { diff --git a/src/app/features/auth/pages/reset-password/reset-password.component.scss b/src/app/features/auth/pages/reset-password/reset-password.component.scss index d85b37855..1bc67d621 100644 --- a/src/app/features/auth/pages/reset-password/reset-password.component.scss +++ b/src/app/features/auth/pages/reset-password/reset-password.component.scss @@ -4,7 +4,7 @@ :host { @include mix.flex-center; flex: 1; - background: url("/assets/images/auth-background.png") center no-repeat; + background: url("/assets/images/dark-blue-gradient.png") center no-repeat; background-size: cover; .reset-password-container, diff --git a/src/app/features/auth/pages/sign-up/sign-up.component.scss b/src/app/features/auth/pages/sign-up/sign-up.component.scss index 8e40212dd..85de9bafc 100644 --- a/src/app/features/auth/pages/sign-up/sign-up.component.scss +++ b/src/app/features/auth/pages/sign-up/sign-up.component.scss @@ -4,7 +4,7 @@ :host { @include mix.flex-column-center; flex: 1; - background: url("/assets/images/auth-background.png") center no-repeat; + background: url("/assets/images/dark-blue-gradient.png") center no-repeat; background-size: cover; .sign-up-container, diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.html b/src/app/features/preprints/components/advisory-group/advisory-group.component.html new file mode 100644 index 000000000..808e9394a --- /dev/null +++ b/src/app/features/preprints/components/advisory-group/advisory-group.component.html @@ -0,0 +1,18 @@ +
+

Advisory Group

+ +

Our advisory group includes leaders in preprints and scholarly communication.

+ + +
diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.scss b/src/app/features/preprints/components/advisory-group/advisory-group.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.spec.ts b/src/app/features/preprints/components/advisory-group/advisory-group.component.spec.ts new file mode 100644 index 000000000..f8bebad42 --- /dev/null +++ b/src/app/features/preprints/components/advisory-group/advisory-group.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AdvisoryGroupComponent } from './advisory-group.component'; + +describe('AdvisoryGroupComponent', () => { + let component: AdvisoryGroupComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AdvisoryGroupComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(AdvisoryGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.ts b/src/app/features/preprints/components/advisory-group/advisory-group.component.ts new file mode 100644 index 000000000..b21b6bbed --- /dev/null +++ b/src/app/features/preprints/components/advisory-group/advisory-group.component.ts @@ -0,0 +1,10 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'osf-advisory-group', + imports: [], + templateUrl: './advisory-group.component.html', + styleUrl: './advisory-group.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdvisoryGroupComponent {} diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html new file mode 100644 index 000000000..a8082bdc2 --- /dev/null +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html @@ -0,0 +1,17 @@ +
+

Browse By Subjects

+
+ +

Architecture

+
+ +

Arts and Humanities

+
+ +

Business

+
+ +

Education

+
+
+
diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.spec.ts b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.spec.ts new file mode 100644 index 000000000..3f73b1161 --- /dev/null +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BrowseBySubjectsComponent } from './browse-by-subjects.component'; + +describe('BrowseBySubjectsComponent', () => { + let component: BrowseBySubjectsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [BrowseBySubjectsComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(BrowseBySubjectsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts new file mode 100644 index 000000000..8a49968bc --- /dev/null +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts @@ -0,0 +1,12 @@ +import { Card } from 'primeng/card'; + +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'osf-browse-by-subjects', + imports: [Card], + templateUrl: './browse-by-subjects.component.html', + styleUrl: './browse-by-subjects.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class BrowseBySubjectsComponent {} diff --git a/src/app/features/preprints/components/index.ts b/src/app/features/preprints/components/index.ts new file mode 100644 index 000000000..3a481a092 --- /dev/null +++ b/src/app/features/preprints/components/index.ts @@ -0,0 +1,3 @@ +export { AdvisoryGroupComponent } from './advisory-group/advisory-group.component'; +export { BrowseBySubjectsComponent } from './browse-by-subjects/browse-by-subjects.component'; +export { PreprintServicesComponent } from './preprint-services/preprint-services.component'; diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.html b/src/app/features/preprints/components/preprint-services/preprint-services.component.html new file mode 100644 index 000000000..89a6fc9ba --- /dev/null +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.html @@ -0,0 +1,8 @@ +
+

Preprint Services

+

+ Leading preprint service providers use this open source infrastructure to support their communities. +

+ +
+
diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.scss b/src/app/features/preprints/components/preprint-services/preprint-services.component.scss new file mode 100644 index 000000000..4558ee387 --- /dev/null +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.scss @@ -0,0 +1,3 @@ +.services-background-image { + background: url("/assets/images/preprints/preprints-services-background.png") center; +} diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.spec.ts b/src/app/features/preprints/components/preprint-services/preprint-services.component.spec.ts new file mode 100644 index 000000000..ab3f2d5a9 --- /dev/null +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PreprintServicesComponent } from './preprint-services.component'; + +describe('PreprintServicesComponent', () => { + let component: PreprintServicesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PreprintServicesComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(PreprintServicesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.ts b/src/app/features/preprints/components/preprint-services/preprint-services.component.ts new file mode 100644 index 000000000..a8104879c --- /dev/null +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.ts @@ -0,0 +1,10 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + selector: 'osf-preprint-services', + imports: [], + templateUrl: './preprint-services.component.html', + styleUrl: './preprint-services.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PreprintServicesComponent {} diff --git a/src/app/features/preprints/constants/preprints.routes.ts b/src/app/features/preprints/constants/preprints.routes.ts new file mode 100644 index 000000000..7dc75b0c8 --- /dev/null +++ b/src/app/features/preprints/constants/preprints.routes.ts @@ -0,0 +1,24 @@ +import { Routes } from '@angular/router'; + +import { PreprintsComponent } from '@osf/features/preprints/preprints.component'; + +export const preprintsRoutes: Routes = [ + { + path: '', + component: PreprintsComponent, + children: [ + { + path: '', + pathMatch: 'full', + redirectTo: 'overview', + }, + { + path: 'overview', + loadComponent: () => + import('@osf/features/preprints/pages/landing/preprints-landing.component').then( + (c) => c.PreprintsLandingComponent + ), + }, + ], + }, +]; diff --git a/src/app/features/preprints/pages/index.ts b/src/app/features/preprints/pages/index.ts new file mode 100644 index 000000000..ae9e70859 --- /dev/null +++ b/src/app/features/preprints/pages/index.ts @@ -0,0 +1 @@ +export { PreprintsLandingComponent } from '@osf/features/preprints/pages/landing/preprints-landing.component'; diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html new file mode 100644 index 000000000..cca53c21a --- /dev/null +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -0,0 +1,52 @@ +
+
+
+ +

Preprints

+
+ + +
+ +
+

A scholarly commons to connect the entire research cycle

+ Powered by OSF Preprints +
+ + + + + Show an example +
+ + + + + + + +
+
+

Create your own branded preprint servers backed by the OSF?

+

+ Check out the + open source code + and our public roadmap. Input + welcome! +

+
+ + + Contact us + +
diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.scss b/src/app/features/preprints/pages/landing/preprints-landing.component.scss new file mode 100644 index 000000000..e6f0d6db9 --- /dev/null +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.scss @@ -0,0 +1,14 @@ +@use "assets/styles/mixins" as mix; +@use "assets/styles/variables" as var; + +.subheader { + color: var.$dark-blue-1; + + a { + font-weight: 700; + } +} + +.blue-dark-gradient { + background: url("/assets/images/dark-blue-gradient.png") center; +} diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.spec.ts b/src/app/features/preprints/pages/landing/preprints-landing.component.spec.ts new file mode 100644 index 000000000..749079411 --- /dev/null +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PreprintsLandingComponent } from './preprints-landing.component'; + +describe('OverviewComponent', () => { + let component: PreprintsLandingComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PreprintsLandingComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(PreprintsLandingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.ts b/src/app/features/preprints/pages/landing/preprints-landing.component.ts new file mode 100644 index 000000000..5d888b707 --- /dev/null +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.ts @@ -0,0 +1,35 @@ +import { Button } from 'primeng/button'; + +import { ChangeDetectionStrategy, Component, HostBinding, signal } from '@angular/core'; +import { RouterLink } from '@angular/router'; + +import { + AdvisoryGroupComponent, + BrowseBySubjectsComponent, + PreprintServicesComponent, +} from '@osf/features/preprints/components'; +import { SearchInputComponent } from '@shared/components'; + +@Component({ + selector: 'osf-overview', + imports: [ + Button, + SearchInputComponent, + RouterLink, + AdvisoryGroupComponent, + PreprintServicesComponent, + BrowseBySubjectsComponent, + ], + templateUrl: './preprints-landing.component.html', + styleUrl: './preprints-landing.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PreprintsLandingComponent { + @HostBinding('class') classes = 'flex-1 flex flex-column w-full h-full'; + + addPreprint() { + // [RNi] TODO: Implement the logic to add a preprint. + } + + searchValue = signal(''); +} diff --git a/src/app/features/preprints/preprints.component.html b/src/app/features/preprints/preprints.component.html new file mode 100644 index 000000000..f58acf390 --- /dev/null +++ b/src/app/features/preprints/preprints.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/app/features/preprints/preprints.component.scss b/src/app/features/preprints/preprints.component.scss new file mode 100644 index 000000000..4ac9ed819 --- /dev/null +++ b/src/app/features/preprints/preprints.component.scss @@ -0,0 +1,7 @@ +@use "assets/styles/mixins" as mix; + +.desktop { + @include mix.flex-column; + flex: 1; + margin-top: 4.5rem; +} diff --git a/src/app/features/preprints/preprints.component.spec.ts b/src/app/features/preprints/preprints.component.spec.ts new file mode 100644 index 000000000..9936528a8 --- /dev/null +++ b/src/app/features/preprints/preprints.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PreprintsComponent } from './preprints.component'; + +describe('PreprintsComponent', () => { + let component: PreprintsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PreprintsComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(PreprintsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/preprints/preprints.component.ts b/src/app/features/preprints/preprints.component.ts new file mode 100644 index 000000000..90508c6f7 --- /dev/null +++ b/src/app/features/preprints/preprints.component.ts @@ -0,0 +1,17 @@ +import { ChangeDetectionStrategy, Component, HostBinding, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { RouterOutlet } from '@angular/router'; + +import { IS_WEB } from '@shared/utils'; + +@Component({ + selector: 'osf-preprints', + imports: [RouterOutlet], + templateUrl: './preprints.component.html', + styleUrl: './preprints.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PreprintsComponent { + protected readonly isDesktop = toSignal(inject(IS_WEB)); + @HostBinding('class') classes = 'flex flex-1 flex-column w-full h-full'; +} diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 5991a5a29..4c5c885bd 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -11,6 +11,7 @@ "support": "Support", "meetings": "Meetings", "myProjects": "My Projects", + "preprints": "Preprints", "donate": "Donate", "profileSettings": "Profile Settings", "accountSettings": "Account Settings", diff --git a/src/assets/images/auth-background.png b/src/assets/images/dark-blue-gradient.png similarity index 100% rename from src/assets/images/auth-background.png rename to src/assets/images/dark-blue-gradient.png diff --git a/src/assets/images/preprints/preprints-services-background.png b/src/assets/images/preprints/preprints-services-background.png new file mode 100644 index 0000000000000000000000000000000000000000..69860ac7f977bbc508ba69c9d896f6837177cc96 GIT binary patch literal 99416 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

fe)C=cI(gB{a!B=`^Y7p0SdNzZjA={$ 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%0Aoc+(#^c1}Eou$STdo%%{T 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 literal 0 HcmV?d00001 diff --git a/src/assets/styles/overrides/button.scss b/src/assets/styles/overrides/button.scss index 6d1d6ffa0..c4d3a7838 100644 --- a/src/assets/styles/overrides/button.scss +++ b/src/assets/styles/overrides/button.scss @@ -200,6 +200,13 @@ } } +.p-button-link { + a { + color: var.$white; + text-decoration: none; + } +} + .p-button-link:hover { .p-button-label { text-decoration: none; @@ -243,11 +250,13 @@ display: flex; flex-direction: column; justify-content: end; + .p-button { background: transparent; color: var.$dark-blue-2; padding: 0; } + i { color: var.$grey-1; } From d3f5886392dd3659b0811e6bfb899dc5963b6844 Mon Sep 17 00:00:00 2001 From: Roma Date: Wed, 28 May 2025 21:25:14 +0300 Subject: [PATCH 02/11] feat(preprints-overview): Implemented advisory board and preprints services with API --- .../core/constants/ngxs-states.constant.ts | 2 + .../advisory-board.component.html | 7 ++ .../advisory-board.component.scss | 10 +++ .../advisory-board.component.spec.ts} | 10 +-- .../advisory-board.component.ts | 18 +++++ .../advisory-group.component.html | 18 ----- .../advisory-group.component.scss | 0 .../advisory-group.component.ts | 10 --- .../features/preprints/components/index.ts | 2 +- .../preprint-services.component.html | 11 ++- .../preprint-services.component.scss | 9 +++ .../preprint-services.component.ts | 8 ++- src/app/features/preprints/mappers/index.ts | 1 + .../preprints/mappers/preprints.mapper.ts | 42 +++++++++++ src/app/features/preprints/models/index.ts | 1 + .../preprints/models/preprints.models.ts | 66 ++++++++++++++++++ .../landing/preprints-landing.component.html | 20 +++--- .../landing/preprints-landing.component.scss | 8 ++- .../landing/preprints-landing.component.ts | 38 ++++++++-- .../preprints/services/brand.service.ts | 13 ++++ src/app/features/preprints/services/index.ts | 2 + .../preprints/services/preprints.service.ts | 44 ++++++++++++ src/app/features/preprints/store/index.ts | 4 ++ .../preprints/store/preprints.actions.ts | 15 ++++ .../preprints/store/preprints.model.ts | 7 ++ .../preprints/store/preprints.selectors.ts | 20 ++++++ .../preprints/store/preprints.state.ts | 69 +++++++++++++++++++ src/assets/styles/_variables.scss | 6 ++ .../styles/components/advisory-board.scss | 15 ++++ src/assets/styles/styles.scss | 1 + 30 files changed, 426 insertions(+), 51 deletions(-) create mode 100644 src/app/features/preprints/components/advisory-board/advisory-board.component.html create mode 100644 src/app/features/preprints/components/advisory-board/advisory-board.component.scss rename src/app/features/preprints/components/{advisory-group/advisory-group.component.spec.ts => advisory-board/advisory-board.component.spec.ts} (58%) create mode 100644 src/app/features/preprints/components/advisory-board/advisory-board.component.ts delete mode 100644 src/app/features/preprints/components/advisory-group/advisory-group.component.html delete mode 100644 src/app/features/preprints/components/advisory-group/advisory-group.component.scss delete mode 100644 src/app/features/preprints/components/advisory-group/advisory-group.component.ts create mode 100644 src/app/features/preprints/mappers/index.ts create mode 100644 src/app/features/preprints/mappers/preprints.mapper.ts create mode 100644 src/app/features/preprints/models/index.ts create mode 100644 src/app/features/preprints/models/preprints.models.ts create mode 100644 src/app/features/preprints/services/brand.service.ts create mode 100644 src/app/features/preprints/services/index.ts create mode 100644 src/app/features/preprints/services/preprints.service.ts create mode 100644 src/app/features/preprints/store/index.ts create mode 100644 src/app/features/preprints/store/preprints.actions.ts create mode 100644 src/app/features/preprints/store/preprints.model.ts create mode 100644 src/app/features/preprints/store/preprints.selectors.ts create mode 100644 src/app/features/preprints/store/preprints.state.ts create mode 100644 src/assets/styles/components/advisory-board.scss diff --git a/src/app/core/constants/ngxs-states.constant.ts b/src/app/core/constants/ngxs-states.constant.ts index d927a789a..ad607cf7f 100644 --- a/src/app/core/constants/ngxs-states.constant.ts +++ b/src/app/core/constants/ngxs-states.constant.ts @@ -4,6 +4,7 @@ import { CollectionsState } from '@osf/features/collections/store'; import { InstitutionsState } from '@osf/features/institutions/store'; import { MeetingsState } from '@osf/features/meetings/store'; import { MyProjectsState } from '@osf/features/my-projects/store'; +import { PreprintsState } from '@osf/features/preprints/store'; import { AnalyticsState } from '@osf/features/project/analytics/store'; import { ProjectOverviewState } from '@osf/features/project/overview/store'; import { WikiState } from '@osf/features/project/wiki/store/wiki.state'; @@ -30,4 +31,5 @@ export const STATES = [ CollectionsState, WikiState, MeetingsState, + PreprintsState, ]; diff --git a/src/app/features/preprints/components/advisory-board/advisory-board.component.html b/src/app/features/preprints/components/advisory-board/advisory-board.component.html new file mode 100644 index 000000000..566ac437e --- /dev/null +++ b/src/app/features/preprints/components/advisory-board/advisory-board.component.html @@ -0,0 +1,7 @@ +@if (htmlContent()) { +
+} diff --git a/src/app/features/preprints/components/advisory-board/advisory-board.component.scss b/src/app/features/preprints/components/advisory-board/advisory-board.component.scss new file mode 100644 index 000000000..290ed974e --- /dev/null +++ b/src/app/features/preprints/components/advisory-board/advisory-board.component.scss @@ -0,0 +1,10 @@ +@use "assets/styles/variables" as var; + +.advisory-board-section { + background: var(--preprints-branding-hero-background-image-url); + + &.osf-preprint-service { + background-image: none; + background-color: var(--preprints-branding-primary-color); + } +} diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.spec.ts b/src/app/features/preprints/components/advisory-board/advisory-board.component.spec.ts similarity index 58% rename from src/app/features/preprints/components/advisory-group/advisory-group.component.spec.ts rename to src/app/features/preprints/components/advisory-board/advisory-board.component.spec.ts index f8bebad42..4b3b51231 100644 --- a/src/app/features/preprints/components/advisory-group/advisory-group.component.spec.ts +++ b/src/app/features/preprints/components/advisory-board/advisory-board.component.spec.ts @@ -1,17 +1,17 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdvisoryGroupComponent } from './advisory-group.component'; +import { AdvisoryBoardComponent } from './advisory-board.component'; describe('AdvisoryGroupComponent', () => { - let component: AdvisoryGroupComponent; - let fixture: ComponentFixture; + let component: AdvisoryBoardComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [AdvisoryGroupComponent], + imports: [AdvisoryBoardComponent], }).compileComponents(); - fixture = TestBed.createComponent(AdvisoryGroupComponent); + fixture = TestBed.createComponent(AdvisoryBoardComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/features/preprints/components/advisory-board/advisory-board.component.ts b/src/app/features/preprints/components/advisory-board/advisory-board.component.ts new file mode 100644 index 000000000..8471e964d --- /dev/null +++ b/src/app/features/preprints/components/advisory-board/advisory-board.component.ts @@ -0,0 +1,18 @@ +import { NgClass } from '@angular/common'; +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +import { StringOrNullOrUndefined } from '@core/helpers'; +import { Brand } from '@osf/features/preprints/models'; + +@Component({ + selector: 'osf-advisory-board', + imports: [NgClass], + templateUrl: './advisory-board.component.html', + styleUrl: './advisory-board.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdvisoryBoardComponent { + htmlContent = input(null); + brand = input(); + isLandingPage = input(false); +} diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.html b/src/app/features/preprints/components/advisory-group/advisory-group.component.html deleted file mode 100644 index 808e9394a..000000000 --- a/src/app/features/preprints/components/advisory-group/advisory-group.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Advisory Group

- -

Our advisory group includes leaders in preprints and scholarly communication.

- -
    -
  • Devin Berg : engrXiv, University of Wisconsin-Stout
  • -
  • Pete Binfield : PeerJ PrePrints
  • -
  • Benjamin Brown : PsyArXiv, Georgia Gwinnett College
  • -
  • Philip Cohen : SocArXiv, University of Maryland
  • -
  • Kathleen Fitzpatrick : Modern Language Association
  • -
  • John Inglis : bioRxiv, Cold Spring Harbor Laboratory Press
  • -
  • Rebecca Kennison : K | N Consultants
  • -
  • Kristen Ratan : CoKo Foundation
  • -
  • Oya Rieger : Ithaka S+R
  • -
  • Judy Ruttenberg : SHARE, Association of Research Libraries
  • -
-
diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.scss b/src/app/features/preprints/components/advisory-group/advisory-group.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/features/preprints/components/advisory-group/advisory-group.component.ts b/src/app/features/preprints/components/advisory-group/advisory-group.component.ts deleted file mode 100644 index b21b6bbed..000000000 --- a/src/app/features/preprints/components/advisory-group/advisory-group.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; - -@Component({ - selector: 'osf-advisory-group', - imports: [], - templateUrl: './advisory-group.component.html', - styleUrl: './advisory-group.component.scss', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class AdvisoryGroupComponent {} diff --git a/src/app/features/preprints/components/index.ts b/src/app/features/preprints/components/index.ts index 3a481a092..6eeb82459 100644 --- a/src/app/features/preprints/components/index.ts +++ b/src/app/features/preprints/components/index.ts @@ -1,3 +1,3 @@ -export { AdvisoryGroupComponent } from './advisory-group/advisory-group.component'; export { BrowseBySubjectsComponent } from './browse-by-subjects/browse-by-subjects.component'; export { PreprintServicesComponent } from './preprint-services/preprint-services.component'; +export { AdvisoryBoardComponent } from '@osf/features/preprints/components/advisory-board/advisory-board.component'; diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.html b/src/app/features/preprints/components/preprint-services/preprint-services.component.html index 89a6fc9ba..f52d4cce4 100644 --- a/src/app/features/preprints/components/preprint-services/preprint-services.component.html +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.html @@ -4,5 +4,14 @@

Preprint Services

Leading preprint service providers use this open source infrastructure to support their communities.

-
+
+ @for (preprintProvider of preprintProvidersToAdvertise(); track preprintProvider.id) { + + + } +
diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.scss b/src/app/features/preprints/components/preprint-services/preprint-services.component.scss index 4558ee387..48145b541 100644 --- a/src/app/features/preprints/components/preprint-services/preprint-services.component.scss +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.scss @@ -1,3 +1,12 @@ .services-background-image { background: url("/assets/images/preprints/preprints-services-background.png") center; } + +.preprint-provider-grid-item { + display: block; + width: 140px; + height: 70px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.ts b/src/app/features/preprints/components/preprint-services/preprint-services.component.ts index a8104879c..73c9b3b35 100644 --- a/src/app/features/preprints/components/preprint-services/preprint-services.component.ts +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.ts @@ -1,4 +1,6 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +import { PreprintProviderToAdvertise } from '@osf/features/preprints/models'; @Component({ selector: 'osf-preprint-services', @@ -7,4 +9,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; styleUrl: './preprint-services.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PreprintServicesComponent {} +export class PreprintServicesComponent { + preprintProvidersToAdvertise = input.required(); +} diff --git a/src/app/features/preprints/mappers/index.ts b/src/app/features/preprints/mappers/index.ts new file mode 100644 index 000000000..7ed240bce --- /dev/null +++ b/src/app/features/preprints/mappers/index.ts @@ -0,0 +1 @@ +export * from './preprints.mapper'; diff --git a/src/app/features/preprints/mappers/preprints.mapper.ts b/src/app/features/preprints/mappers/preprints.mapper.ts new file mode 100644 index 000000000..d1642beca --- /dev/null +++ b/src/app/features/preprints/mappers/preprints.mapper.ts @@ -0,0 +1,42 @@ +import { + PreprintProviderDetails, + PreprintProviderDetailsGetResponse, + PreprintProviderToAdvertise, +} from '@osf/features/preprints/models'; + +export class PreprintsMapper { + static fromPreprintProviderDetailsGetResponse(response: PreprintProviderDetailsGetResponse): PreprintProviderDetails { + const brandRaw = response.embeds!.brand.data; + return { + id: response.id, + name: response.attributes.name, + descriptionHtml: response.attributes.description, + advisoryBoardHtml: response.attributes.advisory_board, + examplePreprintId: response.attributes.example, + domain: response.attributes.domain, + footerLinksHtml: response.attributes.footer_links, + preprintWord: response.attributes.preprint_word, + brand: { + id: brandRaw.id, + name: brandRaw.attributes.name, + heroLogoImageUrl: brandRaw.attributes.hero_logo_image, + heroBackgroundImageUrl: brandRaw.attributes.hero_background_image, + topNavLogoImageUrl: brandRaw.attributes.topnav_logo_image, + primaryColor: brandRaw.attributes.primary_color, + secondaryColor: brandRaw.attributes.secondary_color, + }, + }; + } + + static fromPreprintProvidersToAdvertiseGetResponse( + response: PreprintProviderDetailsGetResponse[] + ): PreprintProviderToAdvertise[] { + return response + .filter((item) => !item.id.includes('osf')) + .map((item) => ({ + id: item.id, + name: item.attributes.name, + whiteWideImageUrl: item.attributes.assets.wide_white, + })); + } +} diff --git a/src/app/features/preprints/models/index.ts b/src/app/features/preprints/models/index.ts new file mode 100644 index 000000000..946c7656c --- /dev/null +++ b/src/app/features/preprints/models/index.ts @@ -0,0 +1 @@ +export * from './preprints.models'; diff --git a/src/app/features/preprints/models/preprints.models.ts b/src/app/features/preprints/models/preprints.models.ts new file mode 100644 index 000000000..02dcff412 --- /dev/null +++ b/src/app/features/preprints/models/preprints.models.ts @@ -0,0 +1,66 @@ +import { StringOrNull } from '@core/helpers'; + +// domain models +export interface Brand { + id: string; + name: string; + heroLogoImageUrl: string; + heroBackgroundImageUrl: string; + topNavLogoImageUrl: string; + primaryColor: string; + secondaryColor: string; +} + +export interface PreprintProviderDetails { + id: string; + name: string; + descriptionHtml: string; + advisoryBoardHtml: StringOrNull; + examplePreprintId: string; + domain: string; + footerLinksHtml: string; + preprintWord: string; + brand: Brand; +} + +export interface PreprintProviderToAdvertise { + id: string; + name: string; + whiteWideImageUrl: string; +} + +//api models +export interface PreprintProviderDetailsGetResponse { + id: string; + type: 'preprint-providers'; + attributes: { + name: string; + description: string; + advisory_board: StringOrNull; + example: string; + domain: string; + footer_links: string; + preprint_word: string; + assets: { + wide_white: string; + }; + }; + embeds?: { + brand: { + data: BrandGetResponse; + }; + }; +} + +export interface BrandGetResponse { + id: string; + type: 'brands'; + attributes: { + name: string; + hero_logo_image: string; + hero_background_image: string; + topnav_logo_image: string; + primary_color: string; + secondary_color: string; + }; +} diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html index cca53c21a..c44ca0bba 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.html +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -4,9 +4,7 @@

Preprints

- Preprints /> -
-

A scholarly commons to connect the entire research cycle

- Powered by OSF Preprints +
+ @if (osfPreprintProvider()) { +
+ } + Powered by OSF Preprints
- Show an example + Show an example - + - +
(''); + + constructor() { + effect(() => { + const provider = this.osfPreprintProvider(); + + if (provider) { + BrandService.applyBranding(provider.brand); + } + }); + } + + ngOnInit(): void { + this.actions.getPreprintProviderById('osf'); + this.actions.getPreprintProvidersToAdvertise(); + } } diff --git a/src/app/features/preprints/services/brand.service.ts b/src/app/features/preprints/services/brand.service.ts new file mode 100644 index 000000000..ece0b5c72 --- /dev/null +++ b/src/app/features/preprints/services/brand.service.ts @@ -0,0 +1,13 @@ +import { Brand } from '@osf/features/preprints/models'; + +export class BrandService { + static applyBranding(brand: Brand): void { + const root = document.documentElement; + + root.style.setProperty('--preprints-branding-primary-color', brand.primaryColor); + root.style.setProperty('--preprints-branding-secondary-color', brand.secondaryColor); + root.style.setProperty('--preprints-branding-hero-logo-image-url', `url(${brand.topNavLogoImageUrl})`); + root.style.setProperty('--preprints-branding-hero-background-image-url', `url(${brand.heroBackgroundImageUrl})`); + root.style.setProperty('--preprints-branding-top-nav-image-url', `url(${brand.heroBackgroundImageUrl})`); + } +} diff --git a/src/app/features/preprints/services/index.ts b/src/app/features/preprints/services/index.ts new file mode 100644 index 000000000..332a94d41 --- /dev/null +++ b/src/app/features/preprints/services/index.ts @@ -0,0 +1,2 @@ +export * from './brand.service'; +export * from './preprints.service'; diff --git a/src/app/features/preprints/services/preprints.service.ts b/src/app/features/preprints/services/preprints.service.ts new file mode 100644 index 000000000..25750d7b6 --- /dev/null +++ b/src/app/features/preprints/services/preprints.service.ts @@ -0,0 +1,44 @@ +import { map, Observable } from 'rxjs'; + +import { inject, Injectable } from '@angular/core'; + +import { JsonApiService } from '@core/services'; +import { JsonApiResponse } from '@osf/core/models'; +import { PreprintsMapper } from '@osf/features/preprints/mappers'; +import { + PreprintProviderDetails, + PreprintProviderDetailsGetResponse, + PreprintProviderToAdvertise, +} from '@osf/features/preprints/models'; + +import { environment } from 'src/environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class PreprintsService { + jsonApiService = inject(JsonApiService); + baseUrl = `${environment.apiUrl}/providers/preprints/`; + + getPreprintProviderById(id: string): Observable { + return this.jsonApiService + .get>(`${this.baseUrl}${id}/?embed=brand`) + .pipe( + map((response) => { + return PreprintsMapper.fromPreprintProviderDetailsGetResponse(response.data); + }) + ); + } + + getPreprintProvidersToAdvertise(): Observable { + return this.jsonApiService + .get< + JsonApiResponse + >(`${this.baseUrl}?filter[advertise_on_discover_page]=true&reload=true`) + .pipe( + map((response) => { + return PreprintsMapper.fromPreprintProvidersToAdvertiseGetResponse(response.data); + }) + ); + } +} diff --git a/src/app/features/preprints/store/index.ts b/src/app/features/preprints/store/index.ts new file mode 100644 index 000000000..d1f1d4f1a --- /dev/null +++ b/src/app/features/preprints/store/index.ts @@ -0,0 +1,4 @@ +export * from './preprints.actions'; +export * from './preprints.model'; +export * from './preprints.selectors'; +export * from './preprints.state'; diff --git a/src/app/features/preprints/store/preprints.actions.ts b/src/app/features/preprints/store/preprints.actions.ts new file mode 100644 index 000000000..5fc7c95fb --- /dev/null +++ b/src/app/features/preprints/store/preprints.actions.ts @@ -0,0 +1,15 @@ +export class GetPreprintProviderById { + static readonly type = '[Preprints] Get Provider By Id'; + + constructor(public id: string) {} +} + +export class GetHighlightedSubjectsByProviderId { + static readonly type = '[Preprints] Get Highlighted Subjects By Provider Id'; + + constructor(public providerId: string) {} +} + +export class GetPreprintProvidersToAdvertise { + static readonly type = '[Preprints] Get Preprint Providers To Advertise'; +} diff --git a/src/app/features/preprints/store/preprints.model.ts b/src/app/features/preprints/store/preprints.model.ts new file mode 100644 index 000000000..ab0a50cc2 --- /dev/null +++ b/src/app/features/preprints/store/preprints.model.ts @@ -0,0 +1,7 @@ +import { PreprintProviderDetails, PreprintProviderToAdvertise } from '@osf/features/preprints/models'; +import { AsyncStateModel } from '@shared/models'; + +export interface PreprintsStateModel { + preprintProviderDetails: AsyncStateModel; + preprintProvidersToAdvertise: AsyncStateModel; +} diff --git a/src/app/features/preprints/store/preprints.selectors.ts b/src/app/features/preprints/store/preprints.selectors.ts new file mode 100644 index 000000000..8b5aa38e2 --- /dev/null +++ b/src/app/features/preprints/store/preprints.selectors.ts @@ -0,0 +1,20 @@ +import { Selector } from '@ngxs/store'; + +import { PreprintsState, PreprintsStateModel } from '@osf/features/preprints/store'; + +export class PreprintsSelectors { + @Selector([PreprintsState]) + static getPreprintProviderDetails(state: PreprintsStateModel) { + return state.preprintProviderDetails.data; + } + + @Selector([PreprintsState]) + static isPreprintProviderDetailsLoading(state: PreprintsStateModel) { + return state.preprintProviderDetails.isLoading; + } + + @Selector([PreprintsState]) + static getPreprintProvidersToAdvertise(state: PreprintsStateModel) { + return state.preprintProvidersToAdvertise.data; + } +} diff --git a/src/app/features/preprints/store/preprints.state.ts b/src/app/features/preprints/store/preprints.state.ts new file mode 100644 index 000000000..2bdc603e1 --- /dev/null +++ b/src/app/features/preprints/store/preprints.state.ts @@ -0,0 +1,69 @@ +import { Action, State, StateContext } from '@ngxs/store'; +import { patch } from '@ngxs/store/operators'; + +import { tap } from 'rxjs'; + +import { inject, Injectable } from '@angular/core'; + +import { PreprintsService } from '@osf/features/preprints/services'; +import { + GetPreprintProviderById, + GetPreprintProvidersToAdvertise, +} from '@osf/features/preprints/store/preprints.actions'; +import { PreprintsStateModel } from '@osf/features/preprints/store/preprints.model'; + +@State({ + name: 'preprints', + defaults: { + preprintProviderDetails: { + data: null, + isLoading: false, + error: null, + }, + preprintProvidersToAdvertise: { + data: [], + isLoading: false, + error: null, + }, + }, +}) +@Injectable() +export class PreprintsState { + #preprintsService = inject(PreprintsService); + + @Action(GetPreprintProviderById) + getPreprintProviderById(ctx: StateContext, action: GetPreprintProviderById) { + ctx.setState(patch({ preprintProviderDetails: patch({ isLoading: true }) })); + + return this.#preprintsService.getPreprintProviderById(action.id).pipe( + tap((data) => { + ctx.setState( + patch({ + preprintProviderDetails: patch({ + data: data, + isLoading: false, + }), + }) + ); + }) + ); + } + + @Action(GetPreprintProvidersToAdvertise) + getPreprintProvidersToAdvertise(ctx: StateContext) { + ctx.setState(patch({ preprintProvidersToAdvertise: patch({ isLoading: true }) })); + + return this.#preprintsService.getPreprintProvidersToAdvertise().pipe( + tap((data) => { + ctx.setState( + patch({ + preprintProvidersToAdvertise: patch({ + data: data, + isLoading: false, + }), + }) + ); + }) + ); + } +} diff --git a/src/assets/styles/_variables.scss b/src/assets/styles/_variables.scss index 175152e55..3a9b57174 100644 --- a/src/assets/styles/_variables.scss +++ b/src/assets/styles/_variables.scss @@ -130,4 +130,10 @@ $white-60: var(--white-60); ), #f3f8fd; --gradient-3: linear-gradient(90.12deg, #dbedfb 0.03%, #eff4fc 54.38%, #dbedfb 98.07%); + + --preprints-branding-primary-color: var(--pr-blue-1); + --preprints-branding-secondary-color: var(--pr-blue-1); + --preprints-branding-hero-logo-image-url: none; + --preprints-branding-hero-background-image-url: none; + --preprints-branding-top-nav-image-url: none; } diff --git a/src/assets/styles/components/advisory-board.scss b/src/assets/styles/components/advisory-board.scss new file mode 100644 index 000000000..2a35daa6f --- /dev/null +++ b/src/assets/styles/components/advisory-board.scss @@ -0,0 +1,15 @@ +.advisory-board-section { + h2 { + font-size: 1.5rem; + margin-bottom: 1.7rem; + } + + ul { + margin-left: 1.5rem; + line-height: 1.7rem; + + li { + list-style: disc; + } + } +} diff --git a/src/assets/styles/styles.scss b/src/assets/styles/styles.scss index 1f70a9e46..762f4635b 100644 --- a/src/assets/styles/styles.scss +++ b/src/assets/styles/styles.scss @@ -36,3 +36,4 @@ @use "./overrides/toggleswitch"; @use "./overrides/tooltip"; @use "./overrides/toast"; +@use "./components/advisory-board"; From f442fff39cdd7fedb73060c9b372fe5d14d921cf Mon Sep 17 00:00:00 2001 From: Roma Date: Thu, 29 May 2025 18:22:03 +0300 Subject: [PATCH 03/11] feat(preprints-overview): Implemented subjects API integration --- .../browse-by-subjects.component.html | 31 ++++++++++++------- .../browse-by-subjects.component.scss | 7 +++++ .../browse-by-subjects.component.ts | 28 +++++++++++++++-- .../preprints/mappers/preprints.mapper.ts | 10 ++++++ .../preprints/models/preprints.models.ts | 15 +++++++++ .../landing/preprints-landing.component.html | 2 +- .../landing/preprints-landing.component.ts | 8 ++++- .../preprints/services/preprints.service.ts | 14 +++++++++ .../preprints/store/preprints.model.ts | 3 +- .../preprints/store/preprints.selectors.ts | 10 ++++++ .../preprints/store/preprints.state.ts | 27 ++++++++++++++++ 11 files changed, 137 insertions(+), 18 deletions(-) diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html index a8082bdc2..661b5bc3c 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html @@ -1,17 +1,24 @@

Browse By Subjects

- -

Architecture

-
- -

Arts and Humanities

-
- -

Business

-
- -

Education

-
+ @if (isLoading()) { + @for (_ of skeletonArray; track $index) { + +
+ +
+
+ } + } @else { + @for (subject of subjects(); track subject) { + + + + } + }
diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss index e69de29bb..7593dce64 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss @@ -0,0 +1,7 @@ +@use "assets/styles/variables" as var; + +.provider-subject { + a { + color: var.$dark-blue-1; + } +} diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts index 8a49968bc..0bf172db2 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts @@ -1,12 +1,34 @@ import { Card } from 'primeng/card'; +import { Skeleton } from 'primeng/skeleton'; -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core'; +import { RouterLink } from '@angular/router'; + +import { Subject } from '@osf/features/preprints/models'; + +import { environment } from 'src/environments/environment'; @Component({ selector: 'osf-browse-by-subjects', - imports: [Card], + imports: [Card, RouterLink, Skeleton], templateUrl: './browse-by-subjects.component.html', styleUrl: './browse-by-subjects.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class BrowseBySubjectsComponent {} +export class BrowseBySubjectsComponent { + subjects = input.required(); + linksToSearchPageForSubject = computed(() => { + return this.subjects().map((subject) => ({ + resourceTab: 3, + activeFilters: JSON.stringify([ + { + filterName: 'Subject', + label: subject.text, + value: `${environment.apiUrl}/subjects/` + subject.id, + }, + ]), + })); + }); + isLoading = input.required(); + skeletonArray = Array.from({ length: 10 }, (_, i) => i + 1); +} diff --git a/src/app/features/preprints/mappers/preprints.mapper.ts b/src/app/features/preprints/mappers/preprints.mapper.ts index d1642beca..4b8069729 100644 --- a/src/app/features/preprints/mappers/preprints.mapper.ts +++ b/src/app/features/preprints/mappers/preprints.mapper.ts @@ -2,6 +2,8 @@ import { PreprintProviderDetails, PreprintProviderDetailsGetResponse, PreprintProviderToAdvertise, + Subject, + SubjectGetResponse, } from '@osf/features/preprints/models'; export class PreprintsMapper { @@ -39,4 +41,12 @@ export class PreprintsMapper { whiteWideImageUrl: item.attributes.assets.wide_white, })); } + + static fromSubjectsGetResponse(response: SubjectGetResponse[]): Subject[] { + return response.map((subject) => ({ + id: subject.id, + text: subject.attributes.text, + taxonomy_name: subject.attributes.taxonomy_name, + })); + } } diff --git a/src/app/features/preprints/models/preprints.models.ts b/src/app/features/preprints/models/preprints.models.ts index 02dcff412..eb9789d31 100644 --- a/src/app/features/preprints/models/preprints.models.ts +++ b/src/app/features/preprints/models/preprints.models.ts @@ -29,6 +29,12 @@ export interface PreprintProviderToAdvertise { whiteWideImageUrl: string; } +export interface Subject { + id: string; + text: string; + taxonomy_name: string; +} + //api models export interface PreprintProviderDetailsGetResponse { id: string; @@ -64,3 +70,12 @@ export interface BrandGetResponse { secondary_color: string; }; } + +export interface SubjectGetResponse { + id: string; + type: 'subjects'; + attributes: { + text: string; + taxonomy_name: string; + }; +} diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html index c44ca0bba..a11f61148 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.html +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -25,7 +25,7 @@

Preprints

Show an example
- + diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.ts b/src/app/features/preprints/pages/landing/preprints-landing.component.ts index b06c1ce80..e3cbfcd5b 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.ts +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.ts @@ -12,6 +12,7 @@ import { } from '@osf/features/preprints/components'; import { BrandService } from '@osf/features/preprints/services'; import { + GetHighlightedSubjectsByProviderId, GetPreprintProviderById, GetPreprintProvidersToAdvertise, PreprintsSelectors, @@ -34,13 +35,17 @@ import { SearchInputComponent } from '@shared/components'; }) export class PreprintsLandingComponent implements OnInit { @HostBinding('class') classes = 'flex-1 flex flex-column w-full h-full'; + private readonly OSF_PROVIDER_ID = 'osf'; private readonly actions = createDispatchMap({ getPreprintProviderById: GetPreprintProviderById, getPreprintProvidersToAdvertise: GetPreprintProvidersToAdvertise, + getHighlightedSubjectsByProviderId: GetHighlightedSubjectsByProviderId, }); osfPreprintProvider = select(PreprintsSelectors.getPreprintProviderDetails); preprintProvidersToAdvertise = select(PreprintsSelectors.getPreprintProvidersToAdvertise); + highlightedSubjectsByProviderId = select(PreprintsSelectors.getHighlightedSubjectsForProvider); + areSubjectsLoading = select(PreprintsSelectors.areSubjectsLoading); addPreprint() { // [RNi] TODO: Implement the logic to add a preprint. @@ -59,7 +64,8 @@ export class PreprintsLandingComponent implements OnInit { } ngOnInit(): void { - this.actions.getPreprintProviderById('osf'); + this.actions.getPreprintProviderById(this.OSF_PROVIDER_ID); this.actions.getPreprintProvidersToAdvertise(); + this.actions.getHighlightedSubjectsByProviderId(this.OSF_PROVIDER_ID); } } diff --git a/src/app/features/preprints/services/preprints.service.ts b/src/app/features/preprints/services/preprints.service.ts index 25750d7b6..6dd185f05 100644 --- a/src/app/features/preprints/services/preprints.service.ts +++ b/src/app/features/preprints/services/preprints.service.ts @@ -9,6 +9,8 @@ import { PreprintProviderDetails, PreprintProviderDetailsGetResponse, PreprintProviderToAdvertise, + Subject, + SubjectGetResponse, } from '@osf/features/preprints/models'; import { environment } from 'src/environments/environment'; @@ -41,4 +43,16 @@ export class PreprintsService { }) ); } + + getHighlightedSubjectsByProviderId(providerId: string): Observable { + return this.jsonApiService + .get< + JsonApiResponse + >(`${this.baseUrl}${providerId}/subjects/highlighted/?page[size]=20`) + .pipe( + map((response) => { + return PreprintsMapper.fromSubjectsGetResponse(response.data); + }) + ); + } } diff --git a/src/app/features/preprints/store/preprints.model.ts b/src/app/features/preprints/store/preprints.model.ts index ab0a50cc2..45a150f0d 100644 --- a/src/app/features/preprints/store/preprints.model.ts +++ b/src/app/features/preprints/store/preprints.model.ts @@ -1,7 +1,8 @@ -import { PreprintProviderDetails, PreprintProviderToAdvertise } from '@osf/features/preprints/models'; +import { PreprintProviderDetails, PreprintProviderToAdvertise, Subject } from '@osf/features/preprints/models'; import { AsyncStateModel } from '@shared/models'; export interface PreprintsStateModel { preprintProviderDetails: AsyncStateModel; preprintProvidersToAdvertise: AsyncStateModel; + highlightedSubjectsForProvider: AsyncStateModel; } diff --git a/src/app/features/preprints/store/preprints.selectors.ts b/src/app/features/preprints/store/preprints.selectors.ts index 8b5aa38e2..b2e0bcee9 100644 --- a/src/app/features/preprints/store/preprints.selectors.ts +++ b/src/app/features/preprints/store/preprints.selectors.ts @@ -17,4 +17,14 @@ export class PreprintsSelectors { static getPreprintProvidersToAdvertise(state: PreprintsStateModel) { return state.preprintProvidersToAdvertise.data; } + + @Selector([PreprintsState]) + static getHighlightedSubjectsForProvider(state: PreprintsStateModel) { + return state.highlightedSubjectsForProvider.data; + } + + @Selector([PreprintsState]) + static areSubjectsLoading(state: PreprintsStateModel) { + return state.highlightedSubjectsForProvider.isLoading; + } } diff --git a/src/app/features/preprints/store/preprints.state.ts b/src/app/features/preprints/store/preprints.state.ts index 2bdc603e1..7ab1f7373 100644 --- a/src/app/features/preprints/store/preprints.state.ts +++ b/src/app/features/preprints/store/preprints.state.ts @@ -7,6 +7,7 @@ import { inject, Injectable } from '@angular/core'; import { PreprintsService } from '@osf/features/preprints/services'; import { + GetHighlightedSubjectsByProviderId, GetPreprintProviderById, GetPreprintProvidersToAdvertise, } from '@osf/features/preprints/store/preprints.actions'; @@ -25,6 +26,11 @@ import { PreprintsStateModel } from '@osf/features/preprints/store/preprints.mod isLoading: false, error: null, }, + highlightedSubjectsForProvider: { + data: [], + isLoading: false, + error: null, + }, }, }) @Injectable() @@ -66,4 +72,25 @@ export class PreprintsState { }) ); } + + @Action(GetHighlightedSubjectsByProviderId) + getHighlightedSubjectsByProviderId( + ctx: StateContext, + action: GetHighlightedSubjectsByProviderId + ) { + ctx.setState(patch({ highlightedSubjectsForProvider: patch({ isLoading: true }) })); + + return this.#preprintsService.getHighlightedSubjectsByProviderId(action.providerId).pipe( + tap((data) => { + ctx.setState( + patch({ + highlightedSubjectsForProvider: patch({ + data: data, + isLoading: false, + }), + }) + ); + }) + ); + } } From 02e26b2bb30f8224b15ceed7f06d33cdac6effc5 Mon Sep 17 00:00:00 2001 From: Roma Date: Thu, 29 May 2025 18:34:40 +0300 Subject: [PATCH 04/11] fix(advisory-board): Fix styles to use rem function --- .../advisory-board/advisory-board.component.html | 2 +- .../advisory-board/advisory-board.component.scss | 5 +++++ src/assets/styles/components/advisory-board.scss | 10 ++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/app/features/preprints/components/advisory-board/advisory-board.component.html b/src/app/features/preprints/components/advisory-board/advisory-board.component.html index 566ac437e..21e9aabfd 100644 --- a/src/app/features/preprints/components/advisory-board/advisory-board.component.html +++ b/src/app/features/preprints/components/advisory-board/advisory-board.component.html @@ -1,7 +1,7 @@ @if (htmlContent()) {
} diff --git a/src/app/features/preprints/components/advisory-board/advisory-board.component.scss b/src/app/features/preprints/components/advisory-board/advisory-board.component.scss index 290ed974e..4526d8747 100644 --- a/src/app/features/preprints/components/advisory-board/advisory-board.component.scss +++ b/src/app/features/preprints/components/advisory-board/advisory-board.component.scss @@ -1,4 +1,5 @@ @use "assets/styles/variables" as var; +@use "assets/styles/mixins" as mix; .advisory-board-section { background: var(--preprints-branding-hero-background-image-url); @@ -8,3 +9,7 @@ background-color: var(--preprints-branding-primary-color); } } + +.m-b-lg { + margin-bottom: mix.rem(24px); +} diff --git a/src/assets/styles/components/advisory-board.scss b/src/assets/styles/components/advisory-board.scss index 2a35daa6f..85fae76d4 100644 --- a/src/assets/styles/components/advisory-board.scss +++ b/src/assets/styles/components/advisory-board.scss @@ -1,12 +1,14 @@ +@use "assets/styles/mixins" as mix; + .advisory-board-section { h2 { - font-size: 1.5rem; - margin-bottom: 1.7rem; + font-size: mix.rem(24px); + margin-bottom: mix.rem(10px); } ul { - margin-left: 1.5rem; - line-height: 1.7rem; + margin-left: mix.rem(24px); + line-height: mix.rem(24px); li { list-style: disc; From 54b4ffe605968c8b8f66ca0a36efba5aaadf623a Mon Sep 17 00:00:00 2001 From: Roma Date: Thu, 29 May 2025 18:50:49 +0300 Subject: [PATCH 05/11] feat(preprint-overview): Added skeleton --- .../pages/landing/preprints-landing.component.html | 7 ++++++- .../pages/landing/preprints-landing.component.scss | 2 +- .../preprints/pages/landing/preprints-landing.component.ts | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html index a11f61148..26fa602bc 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.html +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -13,7 +13,12 @@

Preprints

- @if (osfPreprintProvider()) { + @if (isPreprintProviderLoading()) { +
+ + +
+ } @else {
} Powered by OSF Preprints diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.scss b/src/app/features/preprints/pages/landing/preprints-landing.component.scss index 752b2fd06..2d1fab46b 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.scss +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.scss @@ -9,7 +9,7 @@ a { color: var.$dark-blue-1; .provider-description { - line-height: 24px; + line-height: mix.rem(24px); } } diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.ts b/src/app/features/preprints/pages/landing/preprints-landing.component.ts index e3cbfcd5b..f561690de 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.ts +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.ts @@ -1,6 +1,7 @@ import { createDispatchMap, select } from '@ngxs/store'; import { Button } from 'primeng/button'; +import { Skeleton } from 'primeng/skeleton'; import { ChangeDetectionStrategy, Component, effect, HostBinding, OnInit, signal } from '@angular/core'; import { RouterLink } from '@angular/router'; @@ -28,6 +29,7 @@ import { SearchInputComponent } from '@shared/components'; AdvisoryBoardComponent, PreprintServicesComponent, BrowseBySubjectsComponent, + Skeleton, ], templateUrl: './preprints-landing.component.html', styleUrl: './preprints-landing.component.scss', @@ -43,6 +45,7 @@ export class PreprintsLandingComponent implements OnInit { }); osfPreprintProvider = select(PreprintsSelectors.getPreprintProviderDetails); + isPreprintProviderLoading = select(PreprintsSelectors.isPreprintProviderDetailsLoading); preprintProvidersToAdvertise = select(PreprintsSelectors.getPreprintProvidersToAdvertise); highlightedSubjectsByProviderId = select(PreprintsSelectors.getHighlightedSubjectsForProvider); areSubjectsLoading = select(PreprintsSelectors.areSubjectsLoading); From fe71b64dea317d58276806af68ba550e9a7ce129 Mon Sep 17 00:00:00 2001 From: Roma Date: Thu, 29 May 2025 19:05:45 +0300 Subject: [PATCH 06/11] feat(preprint-overview): Handled enter event for search input, and redirect to search --- .../pages/landing/preprints-landing.component.html | 7 ++++++- .../pages/landing/preprints-landing.component.ts | 14 ++++++++++---- .../search-input/search-input.component.html | 1 + .../search-input/search-input.component.ts | 14 +++++++++++++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html index 26fa602bc..6e776c2a1 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.html +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -24,7 +24,12 @@

Preprints

Powered by OSF Preprints
- + Show an example diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.ts b/src/app/features/preprints/pages/landing/preprints-landing.component.ts index f561690de..dff9daedb 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.ts +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.ts @@ -3,8 +3,8 @@ import { createDispatchMap, select } from '@ngxs/store'; import { Button } from 'primeng/button'; import { Skeleton } from 'primeng/skeleton'; -import { ChangeDetectionStrategy, Component, effect, HostBinding, OnInit, signal } from '@angular/core'; -import { RouterLink } from '@angular/router'; +import { ChangeDetectionStrategy, Component, effect, HostBinding, inject, OnInit } from '@angular/core'; +import { Router, RouterLink } from '@angular/router'; import { AdvisoryBoardComponent, @@ -19,6 +19,7 @@ import { PreprintsSelectors, } from '@osf/features/preprints/store'; import { SearchInputComponent } from '@shared/components'; +import { ResourceTab } from '@shared/enums'; @Component({ selector: 'osf-overview', @@ -37,6 +38,7 @@ import { SearchInputComponent } from '@shared/components'; }) export class PreprintsLandingComponent implements OnInit { @HostBinding('class') classes = 'flex-1 flex flex-column w-full h-full'; + private readonly router = inject(Router); private readonly OSF_PROVIDER_ID = 'osf'; private readonly actions = createDispatchMap({ getPreprintProviderById: GetPreprintProviderById, @@ -54,8 +56,6 @@ export class PreprintsLandingComponent implements OnInit { // [RNi] TODO: Implement the logic to add a preprint. } - searchValue = signal(''); - constructor() { effect(() => { const provider = this.osfPreprintProvider(); @@ -71,4 +71,10 @@ export class PreprintsLandingComponent implements OnInit { this.actions.getPreprintProvidersToAdvertise(); this.actions.getHighlightedSubjectsByProviderId(this.OSF_PROVIDER_ID); } + + redirectToSearchPageWithValue(searchValue: string) { + this.router.navigate(['/search'], { + queryParams: { search: searchValue, resourceTab: ResourceTab.Preprints }, + }); + } } diff --git a/src/app/shared/components/search-input/search-input.component.html b/src/app/shared/components/search-input/search-input.component.html index d1c3a99a5..5a03c7daa 100644 --- a/src/app/shared/components/search-input/search-input.component.html +++ b/src/app/shared/components/search-input/search-input.component.html @@ -7,5 +7,6 @@ pInputText [ngModel]="searchValue()" (ngModelChange)="onSearchChange($event)" + (keydown.enter)="onEnterClicked()" /> diff --git a/src/app/shared/components/search-input/search-input.component.ts b/src/app/shared/components/search-input/search-input.component.ts index 87b6af8b4..441ac1b11 100644 --- a/src/app/shared/components/search-input/search-input.component.ts +++ b/src/app/shared/components/search-input/search-input.component.ts @@ -1,6 +1,6 @@ import { InputText } from 'primeng/inputtext'; -import { ChangeDetectionStrategy, Component, input, model } from '@angular/core'; +import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core'; import { FormsModule } from '@angular/forms'; @Component({ @@ -13,8 +13,20 @@ import { FormsModule } from '@angular/forms'; export class SearchInputComponent { placeholder = input(''); searchValue = model(); + triggerSearch = output(); onSearchChange(value: string): void { this.searchValue.set(value); } + + onEnterClicked() { + const searchValue = this.searchValue(); + if (!searchValue) { + return; + } + + if (searchValue.trim().length > 0) { + this.triggerSearch.emit(searchValue); + } + } } From adaa3eeb3cbe2f8493710ce88f50ccd75b9b9fdc Mon Sep 17 00:00:00 2001 From: Roma Date: Thu, 29 May 2025 19:06:56 +0300 Subject: [PATCH 07/11] fix(browse-by-subjects): Used enum instead of hardcoded value --- .../browse-by-subjects/browse-by-subjects.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts index 0bf172db2..81d47c72d 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts @@ -5,6 +5,7 @@ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/co import { RouterLink } from '@angular/router'; import { Subject } from '@osf/features/preprints/models'; +import { ResourceTab } from '@shared/enums'; import { environment } from 'src/environments/environment'; @@ -19,7 +20,7 @@ export class BrowseBySubjectsComponent { subjects = input.required(); linksToSearchPageForSubject = computed(() => { return this.subjects().map((subject) => ({ - resourceTab: 3, + resourceTab: ResourceTab.Preprints, activeFilters: JSON.stringify([ { filterName: 'Subject', From c1bc2e9d2f2398d31d91a90151f63e60d4fe8371 Mon Sep 17 00:00:00 2001 From: Roma Date: Thu, 29 May 2025 19:37:18 +0300 Subject: [PATCH 08/11] feat(i18n): Extracted static text --- .../browse-by-subjects.component.html | 2 +- .../browse-by-subjects.component.ts | 4 ++- .../preprint-services.component.html | 4 +-- .../preprint-services.component.ts | 4 ++- .../landing/preprints-landing.component.html | 29 ++++++++++--------- .../landing/preprints-landing.component.ts | 3 ++ src/assets/i18n/en.json | 23 +++++++++++++++ 7 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html index 661b5bc3c..f3dd5594d 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html @@ -1,5 +1,5 @@
-

Browse By Subjects

+

{{ 'preprints.browseBySubjects.title' | translate }}

@if (isLoading()) { @for (_ of skeletonArray; track $index) { diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts index 81d47c72d..59681020b 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.ts @@ -1,3 +1,5 @@ +import { TranslateModule } from '@ngx-translate/core'; + import { Card } from 'primeng/card'; import { Skeleton } from 'primeng/skeleton'; @@ -11,7 +13,7 @@ import { environment } from 'src/environments/environment'; @Component({ selector: 'osf-browse-by-subjects', - imports: [Card, RouterLink, Skeleton], + imports: [Card, RouterLink, Skeleton, TranslateModule], templateUrl: './browse-by-subjects.component.html', styleUrl: './browse-by-subjects.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.html b/src/app/features/preprints/components/preprint-services/preprint-services.component.html index f52d4cce4..4c43ca044 100644 --- a/src/app/features/preprints/components/preprint-services/preprint-services.component.html +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.html @@ -1,7 +1,7 @@
-

Preprint Services

+

{{ 'preprints.services.title' | translate }}

- Leading preprint service providers use this open source infrastructure to support their communities. + {{ 'preprints.services.description' | translate }}

diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.ts b/src/app/features/preprints/components/preprint-services/preprint-services.component.ts index 73c9b3b35..076fcd88f 100644 --- a/src/app/features/preprints/components/preprint-services/preprint-services.component.ts +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.ts @@ -1,10 +1,12 @@ +import { TranslateModule } from '@ngx-translate/core'; + import { ChangeDetectionStrategy, Component, input } from '@angular/core'; import { PreprintProviderToAdvertise } from '@osf/features/preprints/models'; @Component({ selector: 'osf-preprint-services', - imports: [], + imports: [TranslateModule], templateUrl: './preprint-services.component.html', styleUrl: './preprint-services.component.scss', changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html index 6e776c2a1..389d81dda 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.html +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -2,12 +2,12 @@
-

Preprints

+

{{ 'preprints.title' | translate }}

@@ -21,18 +21,18 @@

Preprints

} @else {
} - Powered by OSF Preprints + {{ 'preprints.poweredBy' | translate }} - Show an example + {{ 'preprints.showExample' | translate }}
@@ -49,18 +49,21 @@

Preprints

class="blue-dark-gradient py-5 px-3 flex flex-column gap-4 md:py-6 md:px-4 lg:flex-row lg:align-items-center lg:justify-content-between" >
-

Create your own branded preprint servers backed by the OSF?

+

{{ 'preprints.createServer.title' | translate }}

- Check out the - open source code - and our public roadmap. Input - welcome! + {{ 'preprints.createServer.description' | translate }} + {{ + 'preprints.createServer.openSourceCode' | translate + }} + {{ 'preprints.createServer.and' | translate }} + {{ + 'preprints.createServer.publicRoadmap' | translate + }}. {{ 'preprints.createServer.inputWelcome' | translate }}

- Contact us + {{ 'preprints.createServer.contactUs' | translate }}
diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.ts b/src/app/features/preprints/pages/landing/preprints-landing.component.ts index dff9daedb..4e07ba713 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.ts +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.ts @@ -1,5 +1,7 @@ import { createDispatchMap, select } from '@ngxs/store'; +import { TranslateModule } from '@ngx-translate/core'; + import { Button } from 'primeng/button'; import { Skeleton } from 'primeng/skeleton'; @@ -31,6 +33,7 @@ import { ResourceTab } from '@shared/enums'; PreprintServicesComponent, BrowseBySubjectsComponent, Skeleton, + TranslateModule, ], templateUrl: './preprints-landing.component.html', styleUrl: './preprints-landing.component.scss', diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 4c5c885bd..b595607d5 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -912,6 +912,29 @@ "downloadButton": "Download" } }, + "preprints": { + "title": "Preprints", + "addPreprint": "Add a Preprint", + "poweredBy": "Powered by OSF Preprints", + "searchPlaceholder": "Search Preprints", + "showExample": "Show an example", + "browseBySubjects": { + "title": "Browse By Subjects" + }, + "services": { + "title": "Preprint Services", + "description": "Leading preprint service providers use this open source infrastructure to support their communities." + }, + "createServer": { + "title": "Create your own branded preprint servers backed by the OSF?", + "description": "Check out the", + "openSourceCode": "open source code", + "and": "and", + "publicRoadmap": "public roadmap", + "inputWelcome": "Input welcome!", + "contactUs": "Contact us" + } + }, "truncatedText": { "readMore": "Read more", "hide": "Hide" From 65d338b1d31b891fbb1096a8569783db5e19e38a Mon Sep 17 00:00:00 2001 From: Roma Date: Thu, 29 May 2025 19:46:58 +0300 Subject: [PATCH 09/11] fix(i18n): Fixed translate --- .../preprints/pages/landing/preprints-landing.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html index 389d81dda..c24e20f5e 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.html +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -27,7 +27,7 @@

{{ 'preprints.title' | translate }}

From 4acce2198cf584afe3b6a82e5ed703bebeca4ed6 Mon Sep 17 00:00:00 2001 From: Roma Date: Fri, 30 May 2025 11:42:48 +0300 Subject: [PATCH 10/11] fix(pr-comments): Fixed comments --- .../browse-by-subjects/browse-by-subjects.component.html | 4 +++- .../browse-by-subjects/browse-by-subjects.component.scss | 2 +- .../preprint-services/preprint-services.component.scss | 6 ++++-- .../pages/landing/preprints-landing.component.html | 2 +- .../pages/landing/preprints-landing.component.scss | 4 ---- src/app/features/preprints/preprints.component.scss | 2 +- src/app/features/preprints/services/index.ts | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html index f3dd5594d..c7065f18a 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.html @@ -14,7 +14,9 @@

{{ 'preprints.browseBySubjects.title' | translate }}

diff --git a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss index 7593dce64..e52c50881 100644 --- a/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss +++ b/src/app/features/preprints/components/browse-by-subjects/browse-by-subjects.component.scss @@ -1,7 +1,7 @@ @use "assets/styles/variables" as var; .provider-subject { - a { + .subject-link { color: var.$dark-blue-1; } } diff --git a/src/app/features/preprints/components/preprint-services/preprint-services.component.scss b/src/app/features/preprints/components/preprint-services/preprint-services.component.scss index 48145b541..c13d7bb7f 100644 --- a/src/app/features/preprints/components/preprint-services/preprint-services.component.scss +++ b/src/app/features/preprints/components/preprint-services/preprint-services.component.scss @@ -1,11 +1,13 @@ +@use "assets/styles/mixins" as mix; + .services-background-image { background: url("/assets/images/preprints/preprints-services-background.png") center; } .preprint-provider-grid-item { display: block; - width: 140px; - height: 70px; + width: mix.rem(140px); + height: mix.rem(70px); background-size: contain; background-repeat: no-repeat; background-position: center; diff --git a/src/app/features/preprints/pages/landing/preprints-landing.component.html b/src/app/features/preprints/pages/landing/preprints-landing.component.html index c24e20f5e..ddec14bae 100644 --- a/src/app/features/preprints/pages/landing/preprints-landing.component.html +++ b/src/app/features/preprints/pages/landing/preprints-landing.component.html @@ -21,7 +21,7 @@

{{ 'preprints.title' | translate }}

} @else {
} - {{ 'preprints.poweredBy' | translate }} + {{ 'preprints.poweredBy' | translate }} Date: Fri, 30 May 2025 12:52:53 +0300 Subject: [PATCH 11/11] feat(preprints-state): Added error handling --- .../preprints/store/preprints.state.ts | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/app/features/preprints/store/preprints.state.ts b/src/app/features/preprints/store/preprints.state.ts index 7ab1f7373..deaef2f5c 100644 --- a/src/app/features/preprints/store/preprints.state.ts +++ b/src/app/features/preprints/store/preprints.state.ts @@ -1,7 +1,8 @@ import { Action, State, StateContext } from '@ngxs/store'; import { patch } from '@ngxs/store/operators'; -import { tap } from 'rxjs'; +import { tap, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; import { inject, Injectable } from '@angular/core'; @@ -51,7 +52,8 @@ export class PreprintsState { }), }) ); - }) + }), + catchError((error) => this.handleError(ctx, 'preprintProviderDetails', error)) ); } @@ -69,7 +71,8 @@ export class PreprintsState { }), }) ); - }) + }), + catchError((error) => this.handleError(ctx, 'preprintProvidersToAdvertise', error)) ); } @@ -90,7 +93,19 @@ export class PreprintsState { }), }) ); - }) + }), + catchError((error) => this.handleError(ctx, 'highlightedSubjectsForProvider', error)) ); } + + private handleError(ctx: StateContext, section: keyof PreprintsStateModel, error: Error) { + ctx.patchState({ + [section]: { + ...ctx.getState()[section], + isLoading: false, + error: error.message, + }, + }); + return throwError(() => error); + } }