From 1d39dffd566483965979b2293003ab18a6996275 Mon Sep 17 00:00:00 2001 From: Edoardo Borgia Leiva Date: Mon, 9 Feb 2026 20:17:59 +0100 Subject: [PATCH] Base login page --- src/app/pages/login/login.component.css | 104 +++++++++++++++++++++++ src/app/pages/login/login.component.html | 48 +++++++++++ src/app/pages/login/login.component.ts | 60 +++++++++++++ 3 files changed, 212 insertions(+) create mode 100644 src/app/pages/login/login.component.css create mode 100644 src/app/pages/login/login.component.html create mode 100644 src/app/pages/login/login.component.ts diff --git a/src/app/pages/login/login.component.css b/src/app/pages/login/login.component.css new file mode 100644 index 0000000..346f65b --- /dev/null +++ b/src/app/pages/login/login.component.css @@ -0,0 +1,104 @@ +.login-container { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + padding: 20px; +} + +.login-card { + background: white; + border-radius: 12px; + padding: 40px; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 400px; +} + +.login-card h1 { + font-size: 24px; + font-weight: 700; + color: #667eea; + margin: 0 0 10px 0; + text-align: center; +} + +.login-card h2 { + font-size: 28px; + font-weight: 600; + color: #333; + margin: 0 0 30px 0; + text-align: center; +} + +.error-message { + background-color: #fee; + color: #c33; + padding: 12px; + border-radius: 6px; + margin-bottom: 20px; + border: 1px solid #fcc; + font-size: 14px; +} + +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + margin-bottom: 8px; + font-weight: 500; + color: #333; + font-size: 14px; +} + +.form-group input { + width: 100%; + padding: 12px 16px; + border: 2px solid #e1e8ed; + border-radius: 8px; + font-size: 15px; + transition: border-color 0.3s; + box-sizing: border-box; +} + +.form-group input:focus { + outline: none; + border-color: #667eea; +} + +.form-group input::placeholder { + color: #aab8c2; +} + +.btn-primary { + width: 100%; + padding: 14px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 8px; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: + transform 0.2s, + box-shadow 0.2s; + margin-top: 10px; +} + +.btn-primary:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 5px 20px rgba(102, 126, 234, 0.4); +} + +.btn-primary:active:not(:disabled) { + transform: translateY(0); +} + +.btn-primary:disabled { + opacity: 0.6; + cursor: not-allowed; +} diff --git a/src/app/pages/login/login.component.html b/src/app/pages/login/login.component.html new file mode 100644 index 0000000..19b55a4 --- /dev/null +++ b/src/app/pages/login/login.component.html @@ -0,0 +1,48 @@ +
+ +
diff --git a/src/app/pages/login/login.component.ts b/src/app/pages/login/login.component.ts new file mode 100644 index 0000000..c0f1017 --- /dev/null +++ b/src/app/pages/login/login.component.ts @@ -0,0 +1,60 @@ +import { Component, inject, signal, OnInit } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { AuthService } from '../../services/auth.service'; + +@Component({ + selector: 'app-login', + standalone: true, + imports: [FormsModule, CommonModule], + templateUrl: './login.component.html', + styleUrl: './login.component.css' +}) +export class LoginComponent implements OnInit { + private authService = inject(AuthService); + private router = inject(Router); + + ngOnInit() { + // If already logged in, redirect to home + if (this.authService.isAuthenticated()) { + this.router.navigate(['/']); + } + } + + email = ''; + password = ''; + isLoading = signal(false); + errorMessage = signal(''); + + onSubmit() { + if (!this.email || !this.password) { + this.errorMessage.set('Please fill in all fields'); + return; + } + + this.isLoading.set(true); + this.errorMessage.set(''); + + this.authService.login({ + email: this.email, + password: this.password + }).subscribe({ + next: (response) => { + this.isLoading.set(false); + if (response.success) { + // Redirect to home/dashboard after successful login + this.router.navigate(['/']); + } else { + this.errorMessage.set(response.message || 'Login failed'); + } + }, + error: (error) => { + this.isLoading.set(false); + this.errorMessage.set( + error.error?.message || 'Login failed. Please check your credentials.' + ); + } + }); + } +}