From 395a12512d3301218f678ec976a30ca040c64676 Mon Sep 17 00:00:00 2001 From: Roman Nastyuk Date: Thu, 3 Apr 2025 12:54:59 +0300 Subject: [PATCH 1/3] feat(design-my-profile): added my projects route and base component --- src/app/app.routes.ts | 7 ++++++ src/app/core/helpers/nav-items.constant.ts | 6 +++++ .../my-projects/my-projects.component.html | 7 ++++++ .../my-projects/my-projects.component.scss | 4 ++++ .../my-projects/my-projects.component.spec.ts | 22 +++++++++++++++++++ .../my-projects/my-projects.component.ts | 15 +++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 src/app/features/my-projects/my-projects.component.html create mode 100644 src/app/features/my-projects/my-projects.component.scss create mode 100644 src/app/features/my-projects/my-projects.component.spec.ts create mode 100644 src/app/features/my-projects/my-projects.component.ts diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index f103b6436..4a5066435 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -64,6 +64,13 @@ export const routes: Routes = [ (mod) => mod.PrivacyPolicyComponent, ), }, + { + path: 'my-projects', + loadComponent: () => + import('./features/my-projects/my-projects.component').then( + (mod) => mod.MyProjectsComponent, + ), + }, { path: 'settings', loadChildren: () => diff --git a/src/app/core/helpers/nav-items.constant.ts b/src/app/core/helpers/nav-items.constant.ts index 75b9a2860..4382b28b4 100644 --- a/src/app/core/helpers/nav-items.constant.ts +++ b/src/app/core/helpers/nav-items.constant.ts @@ -9,6 +9,12 @@ export const NAV_ITEMS: NavItem[] = [ icon: 'support', useExactMatch: true, }, + { + path: '/my-projects', + label: 'My Projects', + icon: 'my-projects', + useExactMatch: true, + }, { path: '/settings', label: 'Settings', diff --git a/src/app/features/my-projects/my-projects.component.html b/src/app/features/my-projects/my-projects.component.html new file mode 100644 index 000000000..0b9ae27ea --- /dev/null +++ b/src/app/features/my-projects/my-projects.component.html @@ -0,0 +1,7 @@ +
+ +
diff --git a/src/app/features/my-projects/my-projects.component.scss b/src/app/features/my-projects/my-projects.component.scss new file mode 100644 index 000000000..7cf956233 --- /dev/null +++ b/src/app/features/my-projects/my-projects.component.scss @@ -0,0 +1,4 @@ +:host { + .my-projects-container { + } +} diff --git a/src/app/features/my-projects/my-projects.component.spec.ts b/src/app/features/my-projects/my-projects.component.spec.ts new file mode 100644 index 000000000..4a30f174c --- /dev/null +++ b/src/app/features/my-projects/my-projects.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MyProjectsComponent } from './my-projects.component'; + +describe('MyProjectsComponent', () => { + let component: MyProjectsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MyProjectsComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(MyProjectsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/my-projects/my-projects.component.ts b/src/app/features/my-projects/my-projects.component.ts new file mode 100644 index 000000000..ab76f0b8d --- /dev/null +++ b/src/app/features/my-projects/my-projects.component.ts @@ -0,0 +1,15 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { IS_WEB } from '@shared/utils/breakpoints.tokens'; + +@Component({ + selector: 'osf-my-projects', + imports: [SubHeaderComponent], + templateUrl: './my-projects.component.html', + styleUrl: './my-projects.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MyProjectsComponent { + isDesktop = toSignal(inject(IS_WEB)); +} From 494da7906a252331a41ff092540afa0830ea0c2d Mon Sep 17 00:00:00 2001 From: Roman Nastyuk Date: Mon, 7 Apr 2025 15:40:51 +0300 Subject: [PATCH 2/3] feat(design-my-profile): added my profile page layout --- .../nav-menu/nav-menu.component.html | 2 +- .../services/json-api/json-api.service.ts | 39 ++-- src/app/features/home/dashboard.service.ts | 2 +- src/app/features/home/home.component.scss | 2 +- src/app/features/home/home.component.ts | 7 +- .../add-project-form.component.html | 116 +++++++++++ .../add-project-form.component.scss | 12 ++ .../add-project-form.component.spec.ts | 22 ++ .../add-project-form.component.ts | 138 +++++++++++++ .../my-projects/my-projects.component.html | 191 +++++++++++++++++- .../my-projects/my-projects.component.scss | 9 +- .../my-projects/my-projects.component.ts | 106 +++++++++- .../my-projects/my-projects.service.ts | 6 + .../account-settings.component.html | 1 + .../account-settings.component.ts | 3 + .../settings/addons/addons.component.html | 2 +- .../create-developer-app.component.html | 7 +- .../profile-settings.component.html | 1 + .../token-add-edit-form.component.html | 11 +- .../token-add-edit-form.component.scss | 1 - .../token-add-edit-form.component.ts | 3 +- src/assets/icons/dist/icons.css | 6 +- src/assets/icons/dist/icons.eot | Bin 13952 -> 13956 bytes src/assets/icons/dist/icons.woff | Bin 7588 -> 7596 bytes src/assets/icons/dist/icons.woff2 | Bin 6312 -> 6308 bytes src/assets/icons/source/padlock-unlock.svg | 4 +- "src/assets/images/\321\201os-shield.svg" | 9 + src/assets/styles/overrides/button.scss | 10 + src/assets/styles/overrides/checkbox.scss | 6 + .../styles/overrides/confirmation-dialog.scss | 6 + src/assets/styles/overrides/input.scss | 8 + src/assets/styles/overrides/select.scss | 47 +++-- src/assets/styles/overrides/table.scss | 10 +- src/assets/styles/overrides/tabs.scss | 4 + 34 files changed, 719 insertions(+), 72 deletions(-) create mode 100644 src/app/features/my-projects/add-project-form/add-project-form.component.html create mode 100644 src/app/features/my-projects/add-project-form/add-project-form.component.scss create mode 100644 src/app/features/my-projects/add-project-form/add-project-form.component.spec.ts create mode 100644 src/app/features/my-projects/add-project-form/add-project-form.component.ts create mode 100644 src/app/features/my-projects/my-projects.service.ts create mode 100644 "src/assets/images/\321\201os-shield.svg" diff --git a/src/app/core/components/nav-menu/nav-menu.component.html b/src/app/core/components/nav-menu/nav-menu.component.html index 629df1400..ef3285ab8 100644 --- a/src/app/core/components/nav-menu/nav-menu.component.html +++ b/src/app/core/components/nav-menu/nav-menu.component.html @@ -6,7 +6,7 @@ routerLinkActive="active" [routerLinkActiveOptions]="{ exact: item.useExactMatch }" class="nav-link flex" - [class.mt-5]="item.label === 'Settings'" + [class.mt-5]="item.label === 'Settings' || item.label === 'My Projects'" > @if (item.icon) { diff --git a/src/app/core/services/json-api/json-api.service.ts b/src/app/core/services/json-api/json-api.service.ts index 26bf5162f..ea639e05b 100644 --- a/src/app/core/services/json-api/json-api.service.ts +++ b/src/app/core/services/json-api/json-api.service.ts @@ -13,28 +13,25 @@ export class JsonApiService { http: HttpClient = inject(HttpClient); get(url: string, params?: Record): Observable { - let httpParams = new HttpParams(); - - if (params) { - for (const key in params) { - const value = params[key]; + return this.http + .get>(url, { params: this.buildHttpParams(params) }) + .pipe(map((response) => response.data)); + } - if (Array.isArray(value)) { - value.forEach((item) => { - httpParams = httpParams.append(`${key}[]`, item); // Handles arrays - }); - } else { - httpParams = httpParams.set(key, value as string); - } - } - } + getArray(url: string, params?: Record): Observable { + const headers = new HttpHeaders({ + Authorization: 'ENTER_VALID_PAT', + }); return this.http - .get>(url) + .get>(url, { + params: this.buildHttpParams(params), + headers: headers, + }) .pipe(map((response) => response.data)); } - getArray(url: string, params?: Record): Observable { + private buildHttpParams(params?: Record): HttpParams { let httpParams = new HttpParams(); if (params) { @@ -51,14 +48,6 @@ export class JsonApiService { } } - const headers = new HttpHeaders({ - Authorization: `Bearer UlO9O9GNKgVzJD7pUeY53jiQTKJ4U2znXVWNvh0KZQruoENuILx0IIYf9LoDz7Duq72EIm`, - }); - - return this.http - .get< - JsonApiArrayResponse - >(url, { params: httpParams, headers: headers }) - .pipe(map((response) => response.data)); + return httpParams; } } diff --git a/src/app/features/home/dashboard.service.ts b/src/app/features/home/dashboard.service.ts index 94e21caa2..3662e239a 100644 --- a/src/app/features/home/dashboard.service.ts +++ b/src/app/features/home/dashboard.service.ts @@ -13,7 +13,7 @@ export class DashboardService { jsonApiService = inject(JsonApiService); getProjects(): Observable { - const userId = 'k9p2t'; + const userId = 'ENTER_VALID_USER_ID'; const params = { embed: ['bibliographic_contributors', 'parent', 'root'], page: 1, diff --git a/src/app/features/home/home.component.scss b/src/app/features/home/home.component.scss index 36555c7a2..1f089ed85 100644 --- a/src/app/features/home/home.component.scss +++ b/src/app/features/home/home.component.scss @@ -30,7 +30,7 @@ .quick-search-container { background: white; - padding: 1.71rem; + padding: 2rem; .text-center { font-size: 1rem; diff --git a/src/app/features/home/home.component.ts b/src/app/features/home/home.component.ts index 69b6b1e01..9673dab1c 100644 --- a/src/app/features/home/home.component.ts +++ b/src/app/features/home/home.component.ts @@ -32,10 +32,11 @@ import { styleUrl: './home.component.scss', }) export class HomeComponent implements OnInit { - isMedium = toSignal(inject(IS_MEDIUM)); - isMobile = toSignal(inject(IS_XSMALL)); - dashboardService: DashboardService = inject(DashboardService); #store = inject(Store); + protected readonly isMedium = toSignal(inject(IS_MEDIUM)); + protected readonly isMobile = toSignal(inject(IS_XSMALL)); + protected readonly dashboardService: DashboardService = + inject(DashboardService); protected readonly projects = this.#store.selectSignal( HomeSelectors.getProjects, diff --git a/src/app/features/my-projects/add-project-form/add-project-form.component.html b/src/app/features/my-projects/add-project-form/add-project-form.component.html new file mode 100644 index 000000000..89bb7168f --- /dev/null +++ b/src/app/features/my-projects/add-project-form/add-project-form.component.html @@ -0,0 +1,116 @@ +
+ +
+ + +
+ + +
+ + +
+ + +
+
+

Affiliation

+
+ + Select All + + + Remove All + +
+
+ +
+ @for (affiliation of affiliations; track affiliation.value) { +
+ + OSF Logo +
+ } +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
diff --git a/src/app/features/my-projects/add-project-form/add-project-form.component.scss b/src/app/features/my-projects/add-project-form/add-project-form.component.scss new file mode 100644 index 000000000..c2a84a205 --- /dev/null +++ b/src/app/features/my-projects/add-project-form/add-project-form.component.scss @@ -0,0 +1,12 @@ +@use "assets/styles/variables" as var; + +:host { + label { + color: var.$dark-blue-1; + } + + h3 { + text-transform: none; + color: var.$dark-blue-1; + } +} diff --git a/src/app/features/my-projects/add-project-form/add-project-form.component.spec.ts b/src/app/features/my-projects/add-project-form/add-project-form.component.spec.ts new file mode 100644 index 000000000..b4732b1a9 --- /dev/null +++ b/src/app/features/my-projects/add-project-form/add-project-form.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddProjectFormComponent } from './add-project-form.component'; + +describe('AddProjectFormComponent', () => { + let component: AddProjectFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AddProjectFormComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(AddProjectFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/features/my-projects/add-project-form/add-project-form.component.ts b/src/app/features/my-projects/add-project-form/add-project-form.component.ts new file mode 100644 index 000000000..dc416b5d4 --- /dev/null +++ b/src/app/features/my-projects/add-project-form/add-project-form.component.ts @@ -0,0 +1,138 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + inject, + signal, +} from '@angular/core'; +import { CommonModule, NgOptimizedImage } from '@angular/common'; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; +import { ButtonModule } from 'primeng/button'; +import { InputTextModule } from 'primeng/inputtext'; +import { DropdownModule } from 'primeng/dropdown'; +import { CheckboxModule } from 'primeng/checkbox'; +import { Select } from 'primeng/select'; +import { Textarea } from 'primeng/textarea'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; +import { DynamicDialogRef } from 'primeng/dynamicdialog'; +import { Store } from '@ngxs/store'; +import { HomeSelectors } from '@core/store/home'; + +enum ProjectFormControls { + Title = 'title', + StorageLocation = 'storageLocation', + Affiliations = 'affiliations', + Description = 'description', + Template = 'template', +} + +interface ProjectForm { + [ProjectFormControls.Title]: FormControl; + [ProjectFormControls.StorageLocation]: FormControl; + [ProjectFormControls.Affiliations]: FormControl; + [ProjectFormControls.Description]: FormControl; + [ProjectFormControls.Template]: FormControl; +} + +@Component({ + selector: 'osf-add-project-form', + standalone: true, + imports: [ + CommonModule, + ReactiveFormsModule, + ButtonModule, + InputTextModule, + DropdownModule, + CheckboxModule, + Select, + Textarea, + NgOptimizedImage, + ], + templateUrl: './add-project-form.component.html', + styleUrl: './add-project-form.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AddProjectFormComponent { + #store = inject(Store); + protected readonly projects = this.#store.selectSignal( + HomeSelectors.getProjects, + ); + protected readonly isMobile = toSignal(inject(IS_XSMALL)); + protected readonly dialogRef = inject(DynamicDialogRef); + protected readonly ProjectFormControls = ProjectFormControls; + protected readonly hasTemplateSelected = signal(false); + + protected readonly storageLocations = [ + { label: 'United States', value: 'us' }, + { label: 'Canada - Montréal', value: 'ca' }, + { label: 'Germany - Frankfurt', value: 'de-1' }, + ]; + + protected readonly affiliations = [ + { label: 'Affiliation 1', value: 'aff1' }, + { label: 'Affiliation 2', value: 'aff2' }, + { label: 'Affiliation 3', value: 'aff3' }, + ]; + + protected projectTemplateOptions = computed(() => { + return this.projects().map((project) => ({ + label: project.title, + value: project.title, + })); + }); + + readonly projectForm = new FormGroup({ + [ProjectFormControls.Title]: new FormControl('', { + nonNullable: true, + validators: [Validators.required], + }), + [ProjectFormControls.StorageLocation]: new FormControl('us', { + nonNullable: true, + validators: [Validators.required], + }), + [ProjectFormControls.Affiliations]: new FormControl([], { + nonNullable: true, + }), + [ProjectFormControls.Description]: new FormControl('', { + nonNullable: true, + }), + [ProjectFormControls.Template]: new FormControl('', { + nonNullable: true, + }), + }); + + constructor() { + this.projectForm + .get(ProjectFormControls.Template) + ?.valueChanges.subscribe((value) => { + this.hasTemplateSelected.set(!!value); + }); + } + + selectAllAffiliations(): void { + const allAffiliationValues = this.affiliations.map((aff) => aff.value); + this.projectForm + .get(ProjectFormControls.Affiliations) + ?.setValue(allAffiliationValues); + } + + removeAllAffiliations(): void { + this.projectForm.get(ProjectFormControls.Affiliations)?.setValue([]); + } + + submitForm(): void { + if (!this.projectForm.valid) { + this.projectForm.markAllAsTouched(); + return; + } + + // TODO: Integrate with API + this.dialogRef.close(); + } +} diff --git a/src/app/features/my-projects/my-projects.component.html b/src/app/features/my-projects/my-projects.component.html index 0b9ae27ea..28003fa28 100644 --- a/src/app/features/my-projects/my-projects.component.html +++ b/src/app/features/my-projects/my-projects.component.html @@ -1,7 +1,190 @@ -
+
+ +
+ + @if (!isMobile()) { + + My Projects + My Registrations + My Preprints + Bookmarks + + } + + + @if (isMobile()) { + + } + + + + + + + + + Title + + + Contributors + + Modified + + + + + + + + + {{ project.title }} + + {{ getContributorsList(project) }} + {{ project.dateModified | date: "MMM d, y, h:mm a" }} + + + + + + + + + + + + + + Title + + + Contributors + + Modified + + + + + + + + + {{ project.title }} + + {{ getContributorsList(project) }} + {{ project.dateModified | date: "MMM d, y, h:mm a" }} + + + + + + + + + + + + + + Title + + + Contributors + + Modified + + + + + + + {{ project.title }} + {{ getContributorsList(project) }} + {{ project.dateModified | date: "MMM d, y, h:mm a" }} + + + + + + + +

+ You don't have any bookmarks. Click the bookmark icon on projects or + registrations to add them here. +

+
+
+
+
diff --git a/src/app/features/my-projects/my-projects.component.scss b/src/app/features/my-projects/my-projects.component.scss index 7cf956233..507cff8eb 100644 --- a/src/app/features/my-projects/my-projects.component.scss +++ b/src/app/features/my-projects/my-projects.component.scss @@ -1,4 +1,11 @@ +@use "assets/styles/variables" as var; +@use "assets/styles/mixins" as mix; + :host { - .my-projects-container { + @include mix.flex-column; + flex: 1; + + .desktop { + margin-top: 4.5rem; } } diff --git a/src/app/features/my-projects/my-projects.component.ts b/src/app/features/my-projects/my-projects.component.ts index ab76f0b8d..8c3e039ef 100644 --- a/src/app/features/my-projects/my-projects.component.ts +++ b/src/app/features/my-projects/my-projects.component.ts @@ -1,15 +1,111 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + computed, + inject, + OnInit, + signal, +} from '@angular/core'; import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; import { toSignal } from '@angular/core/rxjs-interop'; -import { IS_WEB } from '@shared/utils/breakpoints.tokens'; +import { IS_MEDIUM, IS_WEB, IS_XSMALL } from '@shared/utils/breakpoints.tokens'; +import { DropdownModule } from 'primeng/dropdown'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { Select } from 'primeng/select'; +import { Tab, TabList, TabPanel, TabPanels, Tabs } from 'primeng/tabs'; +import { TabOption } from '@shared/entities/tab-option.interface'; +import { SearchInputComponent } from '@shared/components/search-input/search-input.component'; +import { Project } from '@osf/features/home/models/project.entity'; +import { DatePipe, NgClass } from '@angular/common'; +import { TableModule } from 'primeng/table'; +import { DialogService } from 'primeng/dynamicdialog'; +import { AddProjectFormComponent } from './add-project-form/add-project-form.component'; +import { GetProjects, HomeSelectors } from '@core/store/home'; +import { Store } from '@ngxs/store'; @Component({ selector: 'osf-my-projects', - imports: [SubHeaderComponent], + imports: [ + SubHeaderComponent, + DropdownModule, + ReactiveFormsModule, + Select, + Tab, + TabList, + TabPanel, + TabPanels, + Tabs, + SearchInputComponent, + FormsModule, + DatePipe, + TableModule, + NgClass, + ], templateUrl: './my-projects.component.html', styleUrl: './my-projects.component.scss', + providers: [DialogService], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class MyProjectsComponent { - isDesktop = toSignal(inject(IS_WEB)); +export class MyProjectsComponent implements OnInit { + #dialogService = inject(DialogService); + #store = inject(Store); + defaultTabValue = 0; + protected readonly isDesktop = toSignal(inject(IS_WEB)); + protected readonly isTablet = toSignal(inject(IS_MEDIUM)); + protected readonly isMobile = toSignal(inject(IS_XSMALL)); + protected readonly tabOptions: TabOption[] = [ + { label: 'My Projects', value: 0 }, + { label: 'My Registrations', value: 1 }, + { label: 'My Preprints', value: 2 }, + { label: 'Bookmarks', value: 3 }, + ]; + protected readonly searchValue = signal(''); + protected readonly projects = this.#store.selectSignal( + HomeSelectors.getProjects, + ); + protected selectedTab = this.defaultTabValue; + + filteredProjects = computed(() => { + const search = this.searchValue().toLowerCase(); + return this.projects().filter( + (project) => + project.title.toLowerCase().includes(search) || + project.bibliographicContributors.some((i) => + i.users.familyName.toLowerCase().includes(search), + ), + ); + }); + + getContributorsList(item: Project) { + return this.projects() + .find((i) => i.id === item.id) + ?.bibliographicContributors.map((i) => i.users.familyName) + .join(', '); + } + + onTabChange(index: number): void { + this.selectedTab = index; + } + + createProject(): void { + let dialogWidth = '850px'; + if (this.isMobile()) { + dialogWidth = '345px'; + } else if (this.isTablet()) { + dialogWidth = '500px'; + } + + this.#dialogService.open(AddProjectFormComponent, { + width: dialogWidth, + focusOnShow: false, + header: 'Create Project', + closeOnEscape: true, + modal: true, + closable: true, + }); + } + + ngOnInit() { + this.#store.dispatch(GetProjects); + } } diff --git a/src/app/features/my-projects/my-projects.service.ts b/src/app/features/my-projects/my-projects.service.ts new file mode 100644 index 000000000..7eb9e1cdd --- /dev/null +++ b/src/app/features/my-projects/my-projects.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class MyProjectsService {} diff --git a/src/app/features/settings/account-settings/account-settings.component.html b/src/app/features/settings/account-settings/account-settings.component.html index 4c3b2af68..a07c9063d 100644 --- a/src/app/features/settings/account-settings/account-settings.component.html +++ b/src/app/features/settings/account-settings/account-settings.component.html @@ -71,6 +71,7 @@ size="large" optionLabel="name" [options]="MOCK_COUNTRIES" + [class.mobile]="isMobile()" > diff --git a/src/app/features/settings/account-settings/account-settings.component.ts b/src/app/features/settings/account-settings/account-settings.component.ts index 13ced1dd2..292161146 100644 --- a/src/app/features/settings/account-settings/account-settings.component.ts +++ b/src/app/features/settings/account-settings/account-settings.component.ts @@ -14,6 +14,8 @@ import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog'; import { AddEmailComponent } from '@osf/features/settings/account-settings/add-email/add-email.component'; import { DeactivateAccountComponent } from '@osf/features/settings/account-settings/deactivate-account/deactivate-account/deactivate-account.component'; import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.component'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { IS_XSMALL } from '@shared/utils/breakpoints.tokens'; @Component({ selector: 'osf-account-settings', @@ -32,6 +34,7 @@ import { SubHeaderComponent } from '@shared/components/sub-header/sub-header.com changeDetection: ChangeDetectionStrategy.OnPush, }) export class AccountSettingsComponent { + protected readonly isMobile = toSignal(inject(IS_XSMALL)); readonly passwordForm: AccountSettingsPasswordForm = new FormGroup({ [AccountSettingsPasswordFormControls.OldPassword]: new FormControl('', { nonNullable: true, diff --git a/src/app/features/settings/addons/addons.component.html b/src/app/features/settings/addons/addons.component.html index 9665e5762..3029fea83 100644 --- a/src/app/features/settings/addons/addons.component.html +++ b/src/app/features/settings/addons/addons.component.html @@ -8,7 +8,7 @@ } - + @if (isMobile()) {
- + {{ scope.name }}
@if (isEditMode()) { } @else { - + (null); protected readonly dialogRef = inject(DynamicDialogRef); protected readonly TokenFormControls = TokenFormControls; protected readonly availableScopes = AVAILABLE_SCOPES; - protected readonly isXSmall = toSignal(this.#isXSmall$); readonly tokenForm: TokenForm = new FormGroup({ [TokenFormControls.TokenName]: new FormControl('', { diff --git a/src/assets/icons/dist/icons.css b/src/assets/icons/dist/icons.css index 16a56b439..51acb8f33 100644 --- a/src/assets/icons/dist/icons.css +++ b/src/assets/icons/dist/icons.css @@ -1,8 +1,8 @@ @font-face { font-family: "icons"; - src: url("./icons.eot?267e1361c5162f8531987133aab36e82#iefix") format("embedded-opentype"), -url("./icons.woff2?267e1361c5162f8531987133aab36e82") format("woff2"), -url("./icons.woff?267e1361c5162f8531987133aab36e82") format("woff"); + src: url("./icons.eot?a271474648ad6936d1452fb3c3e64f75#iefix") format("embedded-opentype"), +url("./icons.woff2?a271474648ad6936d1452fb3c3e64f75") format("woff2"), +url("./icons.woff?a271474648ad6936d1452fb3c3e64f75") format("woff"); } i[class^="osf-icon-"]:before, i[class*=" osf-icon-"]:before { diff --git a/src/assets/icons/dist/icons.eot b/src/assets/icons/dist/icons.eot index e3179bcdeba8e70bf62f3a150c4f30c65641ffba..42a48c33e8d21ffe9a9d9236978db20efe9c99a0 100644 GIT binary patch delta 380 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 diff --git a/src/assets/icons/dist/icons.woff2 b/src/assets/icons/dist/icons.woff2 index f25e0e415587b4dcb284b074f108273c59a041a2..404453eea6f1ba23be01d0ed124a969efc90e48a 100644 GIT binary patch literal 6308 zcmV;V7+dFePew8T0RR9102rhI3jhEB05#|U02o#P0RR9100000000000000000000 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 diff --git a/src/assets/icons/source/padlock-unlock.svg b/src/assets/icons/source/padlock-unlock.svg index 3123b1c1d..03c241f75 100644 --- a/src/assets/icons/source/padlock-unlock.svg +++ b/src/assets/icons/source/padlock-unlock.svg @@ -1,5 +1,5 @@ - + - + diff --git "a/src/assets/images/\321\201os-shield.svg" "b/src/assets/images/\321\201os-shield.svg" new file mode 100644 index 000000000..1ac2eba44 --- /dev/null +++ "b/src/assets/images/\321\201os-shield.svg" @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/styles/overrides/button.scss b/src/assets/styles/overrides/button.scss index d48874bcf..4d2203936 100644 --- a/src/assets/styles/overrides/button.scss +++ b/src/assets/styles/overrides/button.scss @@ -74,6 +74,14 @@ } } +.secondary-transparent { + .p-button.p-button-secondary { + padding: 0; + background-color: transparent; + font-weight: 600; + } +} + .p-button.p-button-info { color: var.$dark-blue-1; background-color: transparent; @@ -143,6 +151,7 @@ .btn-full-width { width: 100%; + .p-button { width: 100%; } @@ -150,6 +159,7 @@ .btn-half-width { width: 50%; + .p-button { width: 100%; } diff --git a/src/assets/styles/overrides/checkbox.scss b/src/assets/styles/overrides/checkbox.scss index 310bb0fa4..d3e82f89d 100644 --- a/src/assets/styles/overrides/checkbox.scss +++ b/src/assets/styles/overrides/checkbox.scss @@ -25,3 +25,9 @@ width: 0.7rem; } } + +.affiliation-checkbox { + .p-checkbox-box { + border-color: var.$pr-blue-1; + } +} diff --git a/src/assets/styles/overrides/confirmation-dialog.scss b/src/assets/styles/overrides/confirmation-dialog.scss index e59ae5a8b..9b7157887 100644 --- a/src/assets/styles/overrides/confirmation-dialog.scss +++ b/src/assets/styles/overrides/confirmation-dialog.scss @@ -8,6 +8,12 @@ .p-dialog-header { padding: 24px; + .p-dialog-header-actions { + .p-button { + padding-right: 0.2rem; + } + } + .p-dialog-title { font-size: 18px; font-weight: 700; diff --git a/src/assets/styles/overrides/input.scss b/src/assets/styles/overrides/input.scss index 8650e5e70..4c9313f92 100644 --- a/src/assets/styles/overrides/input.scss +++ b/src/assets/styles/overrides/input.scss @@ -57,6 +57,14 @@ p-password.ng-touched.ng-invalid { } } +.p-textarea, +.p-textarea:enabled:focus { + border-color: var.$grey-2; + font-size: 16px; + border-radius: 0.57rem; + box-shadow: none; +} + .addon-input { .p-inputtext { border-bottom-left-radius: 0; diff --git a/src/assets/styles/overrides/select.scss b/src/assets/styles/overrides/select.scss index 7ec5107d2..06e458890 100644 --- a/src/assets/styles/overrides/select.scss +++ b/src/assets/styles/overrides/select.scss @@ -8,28 +8,41 @@ outline: none; font-size: 16px; color: var.$dark-blue-1; +} - .p-select-label { - @include mix.flex-align-center; - width: 100%; - justify-content: center; - padding-left: 2.6rem; - font-weight: 700; +.p-select-label { + @include mix.flex-align-center; + width: 100%; +} + +.p-select-option { + color: var.$dark-blue-1; + + &:hover { + background: var.$bg-blue-3; } - .p-select-option { - color: var.$dark-blue-1; + &.p-select-option-selected { + background: var.$bg-blue-2; + } - &:hover { - background: var.$bg-blue-3; - } + &.p-select-option-selected { + background: var.$bg-blue-2; + } +} + +.p-select-header { + width: 100%; - &.p-select-option-selected { - background: var.$bg-blue-2; - } + .p-iconfield { + width: 100%; + } +} - &.p-select-option-selected.p-focus { - background: var.$bg-blue-2; - } +.p-select.mobile { + .p-select-label { + justify-content: center; + padding-left: 2.6rem; + font-weight: 700; } } diff --git a/src/assets/styles/overrides/table.scss b/src/assets/styles/overrides/table.scss index 8bdf63328..f07fc5e6a 100644 --- a/src/assets/styles/overrides/table.scss +++ b/src/assets/styles/overrides/table.scss @@ -10,12 +10,20 @@ } table { + tr:hover { + background: var.$bg-blue-2; + + td { + background: var.$bg-blue-2; + } + } + th, td { color: var.$dark-blue-1; border: none; height: 60px; - max-width: calc((100vw - 27rem) / 3); + //max-width: calc((100vw - 27rem) / 3); } th { diff --git a/src/assets/styles/overrides/tabs.scss b/src/assets/styles/overrides/tabs.scss index e9cbad9a6..14a10d441 100644 --- a/src/assets/styles/overrides/tabs.scss +++ b/src/assets/styles/overrides/tabs.scss @@ -1,5 +1,9 @@ @use "assets/styles/variables" as var; +.p-tabpanels { + padding: 1.71rem; +} + .p-tablist-tab-list { background: transparent; border: none; From 46459f0bec0b1a3b0490f055c29c71030994d34b Mon Sep 17 00:00:00 2001 From: Roman Nastyuk Date: Mon, 7 Apr 2025 19:43:34 +0300 Subject: [PATCH 3/3] feat(design-my-profile): style changes --- .../add-project-form.component.html | 2 - .../my-projects/my-projects.component.html | 46 +++++----- .../my-projects/my-projects.component.ts | 5 +- .../search-input/search-input.component.scss | 6 +- src/assets/styles/overrides/select.scss | 8 +- src/assets/styles/overrides/table.scss | 83 +++++++++++++++++-- 6 files changed, 112 insertions(+), 38 deletions(-) diff --git a/src/app/features/my-projects/add-project-form/add-project-form.component.html b/src/app/features/my-projects/add-project-form/add-project-form.component.html index 89bb7168f..8cca85a2b 100644 --- a/src/app/features/my-projects/add-project-form/add-project-form.component.html +++ b/src/app/features/my-projects/add-project-form/add-project-form.component.html @@ -18,7 +18,6 @@
Affiliation
- - - {{ project.title }} + +

+ + {{ project.title }} +

{{ getContributorsList(project) }} {{ project.dateModified | date: "MMM d, y, h:mm a" }} @@ -94,7 +96,7 @@ /> - - - {{ project.title }} + +

+ + {{ project.title }} +

{{ getContributorsList(project) }} {{ project.dateModified | date: "MMM d, y, h:mm a" }} @@ -145,7 +149,7 @@ />