From a09e354872d3d2c5264dd7589f1a72a6b985f05e Mon Sep 17 00:00:00 2001 From: saijaku0 Date: Fri, 13 Feb 2026 20:07:31 +0100 Subject: [PATCH 1/3] fix: registration --- .../src/app/core/models/auth.model.ts | 16 +- .../doctor-reviews/doctor-reviews.ts | 3 +- .../pages/doctor-details/doctor-details.html | 1 + .../src/app/pages/register/register.html | 50 +++++ .../src/app/pages/register/register.scss | 184 +++++++++++++++++- .../src/app/pages/register/register.ts | 29 ++- 6 files changed, 269 insertions(+), 14 deletions(-) diff --git a/app/booking-ui/src/app/core/models/auth.model.ts b/app/booking-ui/src/app/core/models/auth.model.ts index 5d0681b..0671c9e 100644 --- a/app/booking-ui/src/app/core/models/auth.model.ts +++ b/app/booking-ui/src/app/core/models/auth.model.ts @@ -4,16 +4,24 @@ export enum UserRole { Patient = 'patient', } +export enum Gender { + Male = 'Male', + Female = 'Female', +} + export interface LoginRequest { email: string; password: string; } export interface RegisterRequest { - UserEmail: string; - UserPassword: string; - UserName: string; - UserSurname: string; + userName: string; + userSurname: string; + userEmail: string; + userPassword: string; + dateOfBirth?: string; + gender?: number; + phoneNumber?: string; } export interface AuthResponse { diff --git a/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts b/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts index 025f4da..cef7792 100644 --- a/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts +++ b/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts @@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output, signal } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { RouterLink } from '@angular/router'; +import { CurrentUser } from '@core/models/auth.model'; import { ReviewDto } from '@core/models/doctor.model'; @Component({ @@ -12,7 +13,7 @@ import { ReviewDto } from '@core/models/doctor.model'; }) export class DoctorReviews { @Input({ required: true }) reviews: ReviewDto[] = []; - @Input() user!: { id: number; name: string }; + @Input() user!: CurrentUser; @Input() isSubmitting = false; @Output() submitReview = new EventEmitter<{ rating: number; text: string }>(); diff --git a/app/booking-ui/src/app/pages/doctor-details/doctor-details.html b/app/booking-ui/src/app/pages/doctor-details/doctor-details.html index 3d55792..3b66b1e 100644 --- a/app/booking-ui/src/app/pages/doctor-details/doctor-details.html +++ b/app/booking-ui/src/app/pages/doctor-details/doctor-details.html @@ -11,6 +11,7 @@ diff --git a/app/booking-ui/src/app/pages/register/register.html b/app/booking-ui/src/app/pages/register/register.html index 5b0637b..f3f0db9 100644 --- a/app/booking-ui/src/app/pages/register/register.html +++ b/app/booking-ui/src/app/pages/register/register.html @@ -32,6 +32,51 @@

Create Account

+
+ + +
+ cake + + + + calendar_today +
+ +

Used to verify your identity and age.

+
+ +
+ + +
+ wc + + + + expand_more +
+
+
@@ -59,4 +104,9 @@

Create Account

Already have an account? Sign In

+
+

Форма валидна: {{ registerForm.valid }}

+

Ошибки даты: {{ registerForm.get('dateOfBirth')?.errors | json }}

+

Ошибки пола: {{ registerForm.get('gender')?.errors | json }}

+
diff --git a/app/booking-ui/src/app/pages/register/register.scss b/app/booking-ui/src/app/pages/register/register.scss index c98f620..dba7aba 100644 --- a/app/booking-ui/src/app/pages/register/register.scss +++ b/app/booking-ui/src/app/pages/register/register.scss @@ -36,12 +36,190 @@ .form-group { flex: 1; - margin-bottom: 0; // Сбрасываем отступ + margin-bottom: 0; + } + } + + .date-field-container { + .input-wrapper { + display: flex; + align-items: center; + position: relative; + border: 1.5px solid #d1d5db; + border-radius: 10px; + padding: 8px 12px; + transition: all 0.2s; + + &.focused { + border-color: #2563eb; + box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); + } + + .leading-icon { + margin-right: 10px; + color: #9ca3af; + } + + input[type='date'] { + border: none; + outline: none; + width: 100%; + background: transparent; + font-family: inherit; + cursor: pointer; + + &::-webkit-calendar-picker-indicator { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + cursor: pointer; + opacity: 0; + } + } + + .calendar-hint { + color: #2563eb; + font-size: 18px; + } + } + } + + .gender-group { + display: flex; + flex-direction: column; + gap: 8px; + + .field-label { + font-size: 0.875rem; + font-weight: 600; + color: #374151; + margin-left: 4px; + } + + .input-wrapper { + display: flex; + align-items: center; + position: relative; + background: #ffffff; + border: 1.5px solid #d1d5db; + border-radius: 12px; + padding: 0 12px; + height: 48px; + transition: all 0.2s ease; + + &.focused { + border-color: #2563eb; + box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.1); + + .leading-icon { + color: #2563eb; + } + .arrow-icon { + color: #2563eb; + } + } + + .leading-icon { + color: #9ca3af; + margin-right: 12px; + font-size: 20px; + } + + .custom-select { + border: none; + outline: none; + background: transparent; + font-size: 1rem; + color: #111827; + width: 100%; + cursor: pointer; + appearance: none; + padding-right: 30px; + z-index: 2; + } + + .arrow-icon { + position: absolute; + right: 12px; + color: #9ca3af; + font-size: 24px; + pointer-events: none; + z-index: 1; + } + } + } + + .gender-group { + display: flex; + flex-direction: column; + gap: 8px; + + .field-label { + font-size: 0.875rem; + font-weight: 600; + color: #374151; + margin-left: 4px; + } + + .input-wrapper { + display: flex; + align-items: center; + position: relative; + background: #ffffff; + border: 1.5px solid #d1d5db; + border-radius: 12px; + padding: 0 12px; + height: 48px; + transition: all 0.2s ease; + + &.focused { + border-color: #2563eb; + box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.1); + + .leading-icon { + color: #2563eb; + } + .arrow-icon { + color: #2563eb; + } + } + + .leading-icon { + color: #9ca3af; + margin-right: 12px; + font-size: 20px; + } + + .custom-select { + border: none; + outline: none; + background: transparent; + font-size: 1rem; + color: #111827; + width: 100%; + cursor: pointer; + appearance: none; + padding-right: 30px; + z-index: 2; + } + + .arrow-icon { + position: absolute; + right: 12px; + color: #9ca3af; + font-size: 24px; + pointer-events: none; + z-index: 1; + } } } .form-group { - margin-bottom: 20px; + margin: 20px 0; label { display: block; margin-bottom: 8px; @@ -68,7 +246,7 @@ .input-wrapper { position: relative; input { - padding-left: 40px; + padding-left: 15px; } .icon { position: absolute; diff --git a/app/booking-ui/src/app/pages/register/register.ts b/app/booking-ui/src/app/pages/register/register.ts index 8ca1214..5639cdd 100644 --- a/app/booking-ui/src/app/pages/register/register.ts +++ b/app/booking-ui/src/app/pages/register/register.ts @@ -17,12 +17,18 @@ export class RegisterComponent { private authService = inject(AuthService); private router = inject(Router); + birthDate = signal(''); + isFocused = signal(false); isLoading = signal(false); errorMessage = signal(null); + isGenderFocused = signal(false); + maxDate = new Date().toISOString().split('T')[0]; registerForm = this.fb.group({ firstName: ['', [Validators.required]], lastName: ['', [Validators.required]], + dateOfBirth: ['', [Validators.required, Validators.pattern(/^\d{4}-\d{2}-\d{2}$/)]], + gender: ['', [Validators.required]], email: ['', [Validators.required, Validators.email]], password: ['', [Validators.required, Validators.minLength(6)]], confirmPassword: ['', [Validators.required]], @@ -31,7 +37,8 @@ export class RegisterComponent { onSubmit() { if (this.registerForm.invalid) return; - const { firstName, lastName, email, password, confirmPassword } = this.registerForm.value; + const { firstName, lastName, email, password, confirmPassword, gender, dateOfBirth } = + this.registerForm.value; if (password !== confirmPassword) { this.errorMessage.set('Passwords do not match'); @@ -42,16 +49,18 @@ export class RegisterComponent { this.errorMessage.set(null); const request: RegisterRequest = { - UserEmail: email!, - UserPassword: password!, - UserName: firstName!, - UserSurname: lastName!, + userEmail: email!, + userPassword: password!, + dateOfBirth: dateOfBirth!, + userName: firstName!, + userSurname: lastName!, + gender: Number(gender), }; this.authService.register(request).subscribe({ next: () => { alert('Registration successful! Please login.'); - this.router.navigate(['/login']); + this.router.navigate(['/auth/login']); }, error: (err) => { console.error(err); @@ -62,4 +71,12 @@ export class RegisterComponent { }, }); } + + onDateChange(value: Event) { + this.birthDate.set((value.target as HTMLInputElement).value); + this.registerForm + .get('dateOfBirth') + ?.setValue((value.target as HTMLInputElement).value, { emitEvent: true }); + this.registerForm.get('dateOfBirth')?.markAsDirty(); + } } From 9572a57a66379c3f34b943114bf0ecbbcea434d5 Mon Sep 17 00:00:00 2001 From: saijaku0 Date: Fri, 13 Feb 2026 21:45:27 +0100 Subject: [PATCH 2/3] feat: add patient dashboard layout --- app/booking-ui/src/app/app.routes.ts | 8 + .../src/app/core/models/patient.models.ts | 10 + .../services/patient/patient.service.spec.ts | 16 ++ .../core/services/patient/patient.service.ts | 28 +++ .../doctor-reviews/doctor-reviews.ts | 2 +- .../layout/patient-layout/patient-layout.html | 46 ++++ .../layout/patient-layout/patient-layout.scss | 201 ++++++++++++++++++ .../patient-layout/patient-layout.spec.ts | 22 ++ .../layout/patient-layout/patient-layout.ts | 42 ++++ .../patient-appointments.html | 1 + .../patient-appointments.scss | 0 .../patient-appointments.spec.ts | 22 ++ .../patient-appointments.ts | 9 + .../app/shared/components/header/header.html | 4 +- .../app/shared/components/header/header.scss | 4 +- 15 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 app/booking-ui/src/app/core/models/patient.models.ts create mode 100644 app/booking-ui/src/app/core/services/patient/patient.service.spec.ts create mode 100644 app/booking-ui/src/app/core/services/patient/patient.service.ts create mode 100644 app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.html create mode 100644 app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.scss create mode 100644 app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.spec.ts create mode 100644 app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.ts create mode 100644 app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.html create mode 100644 app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.scss create mode 100644 app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.spec.ts create mode 100644 app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.ts diff --git a/app/booking-ui/src/app/app.routes.ts b/app/booking-ui/src/app/app.routes.ts index 2deb725..f3e0af3 100644 --- a/app/booking-ui/src/app/app.routes.ts +++ b/app/booking-ui/src/app/app.routes.ts @@ -11,6 +11,7 @@ import { DoctorLayout } from './doctor/layout/doctor-layout/doctor-layout'; import { SpecialtiesComponent } from './admin/pages/specialties/specialties'; import { AdminDashboard } from './admin/pages/admin-dashboard/admin-dashboard'; import { DoctorCalendarComponent } from './doctor/pages/doctor-calendar/doctor-calendar'; +import { PatientLayout } from './patient/layout/patient-layout/patient-layout'; export const routes: Routes = [ { path: '', component: Home }, @@ -45,5 +46,12 @@ export const routes: Routes = [ { path: 'doctors', component: DoctorsComponent }, ], }, + { + path: 'profile', + component: PatientLayout, + canActivate: [authGuard], + data: { roles: ['patient'] }, + children: [{ path: '', redirectTo: 'appointments', pathMatch: 'full' }], + }, { path: '**', redirectTo: '' }, ]; diff --git a/app/booking-ui/src/app/core/models/patient.models.ts b/app/booking-ui/src/app/core/models/patient.models.ts new file mode 100644 index 0000000..c759ad5 --- /dev/null +++ b/app/booking-ui/src/app/core/models/patient.models.ts @@ -0,0 +1,10 @@ +export interface PatientDto { + id: string; + fullName: string; + email: string; + photoUrl: string | null; + phoneNumber: string | null; + dateOfBirth: string; + gender: string; + address: string | null; +} diff --git a/app/booking-ui/src/app/core/services/patient/patient.service.spec.ts b/app/booking-ui/src/app/core/services/patient/patient.service.spec.ts new file mode 100644 index 0000000..d5d13b7 --- /dev/null +++ b/app/booking-ui/src/app/core/services/patient/patient.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { PatientService } from './patient.service'; + +describe('PatientService', () => { + let service: PatientService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(PatientService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/app/booking-ui/src/app/core/services/patient/patient.service.ts b/app/booking-ui/src/app/core/services/patient/patient.service.ts new file mode 100644 index 0000000..4f0a523 --- /dev/null +++ b/app/booking-ui/src/app/core/services/patient/patient.service.ts @@ -0,0 +1,28 @@ +import { HttpClient } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { PatientDto } from '@core/models/patient.models'; +import { environment } from '@env/environment'; +import { map } from 'rxjs/internal/operators/map'; + +@Injectable({ + providedIn: 'root', +}) +export class PatientService { + private http = inject(HttpClient); + private apiUrl = `${environment.apiUrl}/Patient`; + + getPatientProfile() { + return this.http.get(`${this.apiUrl}/profile`).pipe( + map((data) => { + return { + id: data.id, + fullName: data.fullName, + email: data.email, + photoUrl: data.photoUrl || 'assets/default-patient.png', + phoneNumber: data.phoneNumber, + dateOfBirth: data.dateOfBirth, + } as PatientDto; + }), + ); + } +} diff --git a/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts b/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts index cef7792..df003c5 100644 --- a/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts +++ b/app/booking-ui/src/app/pages/doctor-details/components/doctor-reviews/doctor-reviews.ts @@ -13,7 +13,7 @@ import { ReviewDto } from '@core/models/doctor.model'; }) export class DoctorReviews { @Input({ required: true }) reviews: ReviewDto[] = []; - @Input() user!: CurrentUser; + @Input() user: CurrentUser | null = null; @Input() isSubmitting = false; @Output() submitReview = new EventEmitter<{ rating: number; text: string }>(); diff --git a/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.html b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.html new file mode 100644 index 0000000..8aec6dd --- /dev/null +++ b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.html @@ -0,0 +1,46 @@ +
+ + +
+ + + +
+
+

Welcome back {{ patientProfile()?.fullName }}!

+ +
+
+
diff --git a/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.scss b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.scss new file mode 100644 index 0000000..2d12cc8 --- /dev/null +++ b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.scss @@ -0,0 +1,201 @@ +$primary-color: #2563eb; +$sidebar-width: 280px; +$bg-color: #f3f4f6; +$transition-speed: 0.3s cubic-bezier(0.4, 0, 0.2, 1); + +.layout-container { + display: grid; + grid-template-columns: $sidebar-width 1fr; + min-height: 100vh; + background-color: $bg-color; + font-family: 'Inter', sans-serif; + overflow-x: hidden; +} + +.side-toggle-btn { + display: none; +} + +.sidebar { + background: white; + border-right: 1px solid #e5e7eb; + height: 100vh; + position: sticky; + top: 0; + display: flex; + flex-direction: column; + z-index: 50; + + .sidebar-header { + padding: 24px; + display: flex; + justify-content: space-between; + align-items: center; + + h2 { + margin: 0; + color: $primary-color; + font-size: 1.5rem; + font-weight: 700; + } + + .close-btn { + display: none; + } + } + + .nav-links { + padding: 0 16px 24px; + display: flex; + flex-direction: column; + gap: 8px; + flex: 1; + + a, + button.logout-link { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + border-radius: 10px; + text-decoration: none; + color: #4b5563; + font-weight: 500; + transition: all 0.2s; + border: none; + background: none; + cursor: pointer; + font-size: 1rem; + width: 100%; + + &:hover { + background-color: #f9fafb; + color: #111827; + } + + &.active { + background-color: #eff6ff; + color: $primary-color; + .material-icons { + color: $primary-color; + } + } + } + + .logout-link { + margin-top: auto; + color: #ef4444; + &:hover { + background-color: #fef2f2; + color: #dc2626; + } + } + } +} + +.overlay { + display: none; +} + +.content { + padding: 0; + + .page-wrapper { + padding: 32px; + max-width: 1200px; + margin: 0 auto; + } +} + +@media (max-width: 768px) { + .layout-container { + display: block; + } + + .side-toggle-btn { + display: flex; + align-items: center; + justify-content: center; + + position: fixed; + top: 50%; + left: 0; + transform: translateY(-50%); + + width: 32px; + height: 60px; + background-color: $primary-color; + color: white; + + border: none; + border-top-right-radius: 12px; + border-bottom-right-radius: 12px; + + box-shadow: 2px 4px 12px rgba(37, 99, 235, 0.4); + cursor: pointer; + z-index: 1000; + transition: + transform 0.3s ease, + opacity 0.3s; + + &.hidden { + transform: translateY(-50%) translateX(-100%); + opacity: 0; + } + + .material-icons { + font-size: 28px; + } + } + + .sidebar { + position: fixed; + top: 0; + left: 0; + height: 100vh; + width: 85%; + max-width: 320px; + background: white; + + transform: translateX(-100%); + transition: transform $transition-speed; + z-index: 1001; + box-shadow: 4px 0 24px rgba(0, 0, 0, 0.15); + + &.open { + transform: translateX(0); + } + + .sidebar-header .close-btn { + display: block; + background: none; + border: none; + cursor: pointer; + color: #9ca3af; + } + } + + .overlay { + display: block; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(3px); + z-index: 999; + opacity: 0; + visibility: hidden; + transition: opacity $transition-speed; + + &.show { + opacity: 1; + visibility: visible; + } + } + + .content .page-wrapper { + padding: 16px; + } +} diff --git a/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.spec.ts b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.spec.ts new file mode 100644 index 0000000..ec3790d --- /dev/null +++ b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PatientLayout } from './patient-layout'; + +describe('PatientLayout', () => { + let component: PatientLayout; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PatientLayout], + }).compileComponents(); + + fixture = TestBed.createComponent(PatientLayout); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.ts b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.ts new file mode 100644 index 0000000..4e966f4 --- /dev/null +++ b/app/booking-ui/src/app/patient/layout/patient-layout/patient-layout.ts @@ -0,0 +1,42 @@ +import { CommonModule } from '@angular/common'; +import { Component, inject, OnInit, signal } from '@angular/core'; +import { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'; +import { PatientDto } from '@core/models/patient.models'; +import { AuthService } from '@core/services/auth/auth.service'; +import { PatientService } from '@core/services/patient/patient.service'; + +@Component({ + selector: 'app-patient-layout', + imports: [CommonModule, RouterLink, RouterLinkActive, RouterOutlet], + templateUrl: './patient-layout.html', + styleUrl: './patient-layout.scss', +}) +export class PatientLayout implements OnInit { + private authService = inject(AuthService); + private patientService = inject(PatientService); + + currentUser = this.authService.currentUser; + patientProfile = signal(null); + isSidebarOpen = signal(false); + logout = signal(false); + + ngOnInit() { + const user = this.authService.currentUser(); + if (user && user.id) { + this.patientService.getPatientProfile().subscribe({ + next: (profile) => this.patientProfile.set(profile), + error: (err) => console.error('Failed to load patient profile', err), + }); + } else { + console.error('No user logged in'); + } + } + + toggleSidebar() { + this.isSidebarOpen.update((val) => !val); + } + + closeSidebar() { + this.isSidebarOpen.set(false); + } +} diff --git a/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.html b/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.html new file mode 100644 index 0000000..5cc8138 --- /dev/null +++ b/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.html @@ -0,0 +1 @@ +

patient-appointments works!

diff --git a/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.scss b/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.scss new file mode 100644 index 0000000..e69de29 diff --git a/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.spec.ts b/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.spec.ts new file mode 100644 index 0000000..953d7f7 --- /dev/null +++ b/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PatientAppointments } from './patient-appointments'; + +describe('PatientAppointments', () => { + let component: PatientAppointments; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PatientAppointments], + }).compileComponents(); + + fixture = TestBed.createComponent(PatientAppointments); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.ts b/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.ts new file mode 100644 index 0000000..6e61e0e --- /dev/null +++ b/app/booking-ui/src/app/patient/pages/patient-appointments/patient-appointments.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-patient-appointments', + imports: [], + templateUrl: './patient-appointments.html', + styleUrl: './patient-appointments.scss', +}) +export class PatientAppointments {} diff --git a/app/booking-ui/src/app/shared/components/header/header.html b/app/booking-ui/src/app/shared/components/header/header.html index e1e5079..86d8bc1 100644 --- a/app/booking-ui/src/app/shared/components/header/header.html +++ b/app/booking-ui/src/app/shared/components/header/header.html @@ -96,7 +96,9 @@

All Specialties

} @else {