-
-
@@ -189,7 +214,146 @@
Social Link {{ index + 1 }}
- employment
+
+
+
+
+
diff --git a/src/app/features/settings/profile-settings/profile-settings.component.ts b/src/app/features/settings/profile-settings/profile-settings.component.ts
index 917397434..528d43042 100644
--- a/src/app/features/settings/profile-settings/profile-settings.component.ts
+++ b/src/app/features/settings/profile-settings/profile-settings.component.ts
@@ -13,12 +13,20 @@ import { UserSocialLink } from '@osf/features/settings/profile-settings/entities
import {
FormArray,
FormBuilder,
+ FormsModule,
ReactiveFormsModule,
Validators,
} from '@angular/forms';
import { InputGroup } from 'primeng/inputgroup';
import { InputGroupAddon } from 'primeng/inputgroupaddon';
import { socials } from '@osf/features/settings/profile-settings/data';
+import { Checkbox } from 'primeng/checkbox';
+import { DatePicker } from 'primeng/datepicker';
+import { UserPosition } from '@osf/features/settings/profile-settings/entities/user-position.entity';
+import { toSignal } from '@angular/core/rxjs-interop';
+import { IS_XSMALL } from '@osf/shared/utils/breakpoints.tokens';
+import { TabOption } from '@osf/shared/entities/tab-option.interface';
+import { Select } from 'primeng/select';
@Component({
selector: 'osf-profile-settings',
@@ -35,6 +43,10 @@ import { socials } from '@osf/features/settings/profile-settings/data';
ReactiveFormsModule,
InputGroup,
InputGroupAddon,
+ Checkbox,
+ DatePicker,
+ Select,
+ FormsModule,
],
templateUrl: './profile-settings.component.html',
styleUrl: './profile-settings.component.scss',
@@ -46,16 +58,38 @@ export class ProfileSettingsComponent implements OnInit {
socials = socials;
userSocialLinks: UserSocialLink[] = [];
+ userPositions: UserPosition[] = [];
socialLinksForm = this.#fb.group({
links: this.#fb.array([]),
});
+ employmentForm = this.#fb.group({
+ positions: this.#fb.array([]),
+ });
+ protected readonly isMobile = toSignal(inject(IS_XSMALL));
+ protected readonly tabOptions: TabOption[] = [
+ { label: 'Name', value: 0 },
+ { label: 'Social', value: 1 },
+ { label: 'Employment', value: 2 },
+ { label: 'Education', value: 3 },
+ ];
+ protected selectedTab = this.defaultTabValue;
+
+ onTabChange(index: number): void {
+ this.selectedTab = index;
+ }
+
ngOnInit(): void {
if (!this.userSocialLinks.length) {
this.addLink();
}
+
+ if (!this.userPositions.length) {
+ this.addPosition();
+ }
}
+ // Social links methods
get links(): FormArray {
return this.socialLinksForm.get('links') as FormArray;
}
@@ -80,4 +114,30 @@ export class ProfileSettingsComponent implements OnInit {
getPlaceholder(index: number): string {
return this.links.at(index).get('socialOutput')?.value.placeholder;
}
+
+ // Employment methods
+ get positions(): FormArray {
+ return this.employmentForm.get('positions') as FormArray;
+ }
+
+ addPosition(): void {
+ const positionGroup = this.#fb.group({
+ jobTitle: ['', Validators.required],
+ department: [''],
+ institution: ['', Validators.required],
+ startDate: [null, Validators.required],
+ endDate: [null, Validators.required],
+ presentlyEmployed: [false],
+ });
+
+ this.positions.push(positionGroup);
+ }
+
+ removePosition(index: number): void {
+ this.positions.removeAt(index);
+ }
+
+ handleSavePositions(): void {
+ // TODO: Implement save positions
+ }
}
diff --git a/src/app/shared/entities/tab-option.interface.ts b/src/app/shared/entities/tab-option.interface.ts
new file mode 100644
index 000000000..ab36de5b5
--- /dev/null
+++ b/src/app/shared/entities/tab-option.interface.ts
@@ -0,0 +1,4 @@
+export interface TabOption {
+ label: string;
+ value: number;
+}
diff --git a/src/assets/styles/overrides/datepicker.scss b/src/assets/styles/overrides/datepicker.scss
new file mode 100644
index 000000000..ede25d9fc
--- /dev/null
+++ b/src/assets/styles/overrides/datepicker.scss
@@ -0,0 +1,55 @@
+@use "../variables" as var;
+@use "../mixins" as mix;
+
+.p-datepicker {
+ width: 100%;
+
+ .p-datepicker-header {
+ .p-button {
+ background: none;
+ color: var.$grey-2;
+ padding: 0;
+ }
+
+ .p-button-icon-only {
+ width: auto;
+ }
+
+ .p-datepicker-title {
+ button {
+ font-size: 16px;
+ padding: 0;
+ color: var.$dark-blue-1;
+ }
+ }
+ }
+
+ .p-datepicker-day:hover {
+ background: var.$bg-blue-3;
+ }
+
+ .p-datepicker-today > .p-datepicker-day {
+ background: none;
+ color: var.$pr-blue-1;
+ font-weight: 700;
+
+ &:hover {
+ background: var.$pr-blue-2;
+ color: white;
+ }
+ }
+
+ .p-datepicker-day-selected {
+ background: var.$pr-blue-1;
+
+ &:hover {
+ background: var.$pr-blue-2;
+ color: white;
+ }
+ }
+
+ .p-datepicker-today > .p-datepicker-day-selected {
+ background: var.$pr-blue-1;
+ color: white;
+ }
+}
diff --git a/src/assets/styles/overrides/select.scss b/src/assets/styles/overrides/select.scss
new file mode 100644
index 000000000..7ec5107d2
--- /dev/null
+++ b/src/assets/styles/overrides/select.scss
@@ -0,0 +1,35 @@
+@use "assets/styles/variables" as var;
+@use "assets/styles/mixins" as mix;
+
+.p-select {
+ height: 3.125rem;
+ border: 1px solid var(--grey-2);
+ border-radius: 0.57rem;
+ 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-option {
+ color: var.$dark-blue-1;
+
+ &:hover {
+ background: var.$bg-blue-3;
+ }
+
+ &.p-select-option-selected {
+ background: var.$bg-blue-2;
+ }
+
+ &.p-select-option-selected.p-focus {
+ background: var.$bg-blue-2;
+ }
+ }
+}
diff --git a/src/assets/styles/styles.scss b/src/assets/styles/styles.scss
index 8a09902d7..1fde6e6d3 100644
--- a/src/assets/styles/styles.scss
+++ b/src/assets/styles/styles.scss
@@ -19,7 +19,8 @@
@use "./overrides/confirmation-dialog";
@use "./overrides/input-group-addon";
@use "./overrides/iconfield";
-
+@use "./overrides/datepicker";
+@use "./overrides/select";
@layer base, primeng, reset;