From d953afd3b4b6dc36e327b43ec4441c981496d89c Mon Sep 17 00:00:00 2001 From: Nurfog Date: Thu, 20 Aug 2026 10:45:53 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20agregar=20SyncService=20y=20mejorar=20g?= =?UTF-8?q?esti=C3=B3n=20de=20asistencia=20con=20nuevas=20funcionalidades?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Asistencia/App.axaml.cs | 1 + Asistencia/Data/AppDbContext.cs | 77 -------- .../Data/Repositories/AsistenciaRepository.cs | 5 +- .../Data/Repositories/CursoRepository.cs | 7 + Asistencia/Services/AsistenciaService.cs | 7 +- Asistencia/Services/AuthService.cs | 5 +- Asistencia/Services/SyncService.cs | 68 +++++++ Asistencia/ViewModels/AsistenciaViewModel.cs | 172 +++++++----------- Asistencia/ViewModels/DashboardViewModel.cs | 44 +++-- Asistencia/ViewModels/LoginViewModel.cs | 18 +- Asistencia/ViewModels/MainWindowViewModel.cs | 10 +- Asistencia/Views/AsistenciaView.axaml | 165 ++++++++--------- Asistencia/Views/AsistenciaView.axaml.cs | 11 +- Asistencia/Views/DashboardView.axaml | 87 ++++----- Asistencia/Views/LoginView.axaml | 21 ++- 15 files changed, 339 insertions(+), 359 deletions(-) create mode 100644 Asistencia/Services/SyncService.cs diff --git a/Asistencia/App.axaml.cs b/Asistencia/App.axaml.cs index 8ede636..d65c5ae 100644 --- a/Asistencia/App.axaml.cs +++ b/Asistencia/App.axaml.cs @@ -30,6 +30,7 @@ public partial class App : Application services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); Services = services.BuildServiceProvider(); diff --git a/Asistencia/Data/AppDbContext.cs b/Asistencia/Data/AppDbContext.cs index e3b356a..9e9c4e6 100644 --- a/Asistencia/Data/AppDbContext.cs +++ b/Asistencia/Data/AppDbContext.cs @@ -55,82 +55,5 @@ public class AppDbContext : DbContext private static void SeedData(ModelBuilder modelBuilder) { - modelBuilder.Entity().HasData( - new Profesor - { - RutPasaporte = "15668563-1", - Nombre = "Juan", - ApPaterno = "Perez", - ApMaterno = "Gonzalez", - Email = "juan.perez@norteamericano.cl", - Fono = "+56912345678", - Direccion = "Av. Providencia 1234, Santiago", - Clave = "", - CrearClave = true, - Activo = true - } - ); - - modelBuilder.Entity().HasData( - new Curso { IdCursos = 16451, NombreCurso = "English Basic A1" }, - new Curso { IdCursos = 16493, NombreCurso = "English Intermediate B1" } - ); - - modelBuilder.Entity().HasData( - new CursoAbierto - { - IdCursoAbierto = 16451, - IdCursos = 16451, - Sala = "Sala 101", - Sede = "Providencia", - HoraInicio = "09:00", - HoraFin = "10:30", - FechaInicio = new DateTime(2026, 3, 1), - FechaFin = new DateTime(2026, 7, 31), - ProfesorRun = "15668563-1" - }, - new CursoAbierto - { - IdCursoAbierto = 16493, - IdCursos = 16493, - Sala = "Sala 202", - Sede = "Las Condes", - HoraInicio = "14:00", - HoraFin = "15:30", - FechaInicio = new DateTime(2026, 3, 1), - FechaFin = new DateTime(2026, 7, 31), - ProfesorRun = "15668563-1" - } - ); - - modelBuilder.Entity().HasData( - new DetalleContrato - { - IdDetalleContrato = 1, - IdCursoAbierto = 16451, - IdAlumno = "11111111-1", - AP_Paterno = "Garcia", - AP_Materno = "Lopez", - Nombres = "Maria" - }, - new DetalleContrato - { - IdDetalleContrato = 2, - IdCursoAbierto = 16451, - IdAlumno = "22222222-2", - AP_Paterno = "Rodriguez", - AP_Materno = "Soto", - Nombres = "Carlos" - }, - new DetalleContrato - { - IdDetalleContrato = 3, - IdCursoAbierto = 16493, - IdAlumno = "33333333-3", - AP_Paterno = "Martinez", - AP_Materno = "Fernandez", - Nombres = "Ana" - } - ); } } diff --git a/Asistencia/Data/Repositories/AsistenciaRepository.cs b/Asistencia/Data/Repositories/AsistenciaRepository.cs index 0eaa5de..2c4ae4a 100644 --- a/Asistencia/Data/Repositories/AsistenciaRepository.cs +++ b/Asistencia/Data/Repositories/AsistenciaRepository.cs @@ -21,7 +21,7 @@ public class AsistenciaRepository a.Estado == "Activa"); } - public async Task IniciarSesionAsync(int idCursoAbierto, string rut, DateTime fecha, string horaInicio) + public async Task IniciarSesionAsync(int idCursoAbierto, string rut, DateTime fecha, string horaInicio, int tipoAsignacion) { var sesion = new AsistenciaProfesor { @@ -29,7 +29,8 @@ public class AsistenciaRepository RutPasaporte = rut, FechaAsistencia = fecha, HoraInicio = horaInicio, - Estado = "Activa" + Estado = "Activa", + Temporal = tipoAsignacion == 4 ? 1 : 0 }; _context.AsistenciasProfesor.Add(sesion); await _context.SaveChangesAsync(); diff --git a/Asistencia/Data/Repositories/CursoRepository.cs b/Asistencia/Data/Repositories/CursoRepository.cs index adfd3bd..dc0c965 100644 --- a/Asistencia/Data/Repositories/CursoRepository.cs +++ b/Asistencia/Data/Repositories/CursoRepository.cs @@ -33,4 +33,11 @@ public class CursoRepository .Where(d => d.IdCursoAbierto == idCursoAbierto) .ToListAsync(); } + + public async Task BuscarAlumnoPorRutAsync(int idCursoAbierto, string idAlumno) + { + return await _context.DetallesContrato + .FirstOrDefaultAsync(d => d.IdCursoAbierto == idCursoAbierto + && d.IdAlumno == idAlumno); + } } diff --git a/Asistencia/Services/AsistenciaService.cs b/Asistencia/Services/AsistenciaService.cs index 009e58b..578a805 100644 --- a/Asistencia/Services/AsistenciaService.cs +++ b/Asistencia/Services/AsistenciaService.cs @@ -23,13 +23,16 @@ public class AsistenciaService public Task> ObtenerAlumnosAsync(int idCursoAbierto) => _cursoRepo.BuscarAlumnosPorCursoAsync(idCursoAbierto); + public Task BuscarAlumnoPorRutAsync(int idCursoAbierto, string idAlumno) + => _cursoRepo.BuscarAlumnoPorRutAsync(idCursoAbierto, idAlumno); + public Task BuscarSesionActivaAsync(int idCursoAbierto) => _asistenciaRepo.BuscarSesionActivaAsync(idCursoAbierto, DateTime.Today); - public async Task IniciarSesionAsync(int idCursoAbierto, string rut) + public async Task IniciarSesionAsync(int idCursoAbierto, string rut, int tipoAsignacion) { var now = DateTime.Now; - return await _asistenciaRepo.IniciarSesionAsync(idCursoAbierto, rut, now.Date, now.ToString("HH:mm")); + return await _asistenciaRepo.IniciarSesionAsync(idCursoAbierto, rut, now.Date, now.ToString("HH:mm"), tipoAsignacion); } public async Task FinalizarSesionAsync(int idSesion) diff --git a/Asistencia/Services/AuthService.cs b/Asistencia/Services/AuthService.cs index 27f2578..c1e9d0d 100644 --- a/Asistencia/Services/AuthService.cs +++ b/Asistencia/Services/AuthService.cs @@ -15,7 +15,9 @@ public class AuthService public Profesor? CurrentUser => _currentUser; - public async Task<(bool Success, string Message)> LoginAsync(string rut, string password) + public int TipoAsignacionActual { get; private set; } + + public async Task<(bool Success, string Message)> LoginAsync(string rut, int tipoAsignacion) { if (string.IsNullOrWhiteSpace(rut)) return (false, "Ingrese su RUT"); @@ -25,6 +27,7 @@ public class AuthService return (false, "Usuario no encontrado"); _currentUser = profesor; + TipoAsignacionActual = tipoAsignacion; return (true, "Inicio de sesión exitoso"); } diff --git a/Asistencia/Services/SyncService.cs b/Asistencia/Services/SyncService.cs new file mode 100644 index 0000000..7a9c4f8 --- /dev/null +++ b/Asistencia/Services/SyncService.cs @@ -0,0 +1,68 @@ +using Microsoft.EntityFrameworkCore; +using Asistencia.Data; +using Asistencia.Models; + +namespace Asistencia.Services; + +public class SyncService +{ + private readonly AppDbContext _db; + private readonly ConnectivityService _connectivity; + + public SyncService(AppDbContext db, ConnectivityService connectivity) + { + _db = db; + _connectivity = connectivity; + } + + public async Task ContarPendientesAsync() + { + var sesiones = await _db.AsistenciasProfesor + .Where(a => a.Estado == "Finalizada") + .CountAsync(); + + var asistencias = await _db.AsistenciasAlumno.CountAsync(); + + return sesiones + asistencias; + } + + public async Task<(bool Success, string Message)> SincronizarAsync(string apiUrl) + { + if (!await _connectivity.HayConexionAsync()) + return (false, "Sin conexion a internet"); + + var pendientes = await ContarPendientesAsync(); + if (pendientes == 0) + return (true, "No hay datos pendientes"); + + try + { + var sesiones = await _db.AsistenciasProfesor + .Where(a => a.Estado == "Finalizada") + .ToListAsync(); + + foreach (var sesion in sesiones) + { + // TODO: POST to apiUrl + "/api/asistencia-profesor" + // await HttpClient.PostAsJsonAsync(apiUrl + "/api/asistencia-profesor", sesion); + } + + var asistencias = await _db.AsistenciasAlumno.ToListAsync(); + foreach (var asistencia in asistencias) + { + // TODO: POST to apiUrl + "/api/asistencia-alumno" + // await HttpClient.PostAsJsonAsync(apiUrl + "/api/asistencia-alumno", asistencia); + } + + _db.AsistenciasProfesor.RemoveRange(sesiones); + _db.AsistenciasAlumno.RemoveRange(asistencias); + await _db.SaveChangesAsync(); + + return (true, $"Sincronizados {sesiones.Count} sesiones y {asistencias.Count} asistencias"); + } + catch (Exception ex) + { + return (false, $"Error al sincronizar: {ex.Message}"); + } + } +} diff --git a/Asistencia/ViewModels/AsistenciaViewModel.cs b/Asistencia/ViewModels/AsistenciaViewModel.cs index 3a1015a..8aa5f7c 100644 --- a/Asistencia/ViewModels/AsistenciaViewModel.cs +++ b/Asistencia/ViewModels/AsistenciaViewModel.cs @@ -11,100 +11,112 @@ public partial class AsistenciaViewModel : ViewModelBase private readonly AsistenciaService _asistenciaService; private readonly AuthService _authService; private readonly MainWindowViewModel _mainVm; - private readonly CursoAbierto _curso; [ObservableProperty] - private string _nombreCurso = string.Empty; - - [ObservableProperty] - private string _infoCurso = string.Empty; + private string _inputCursoAbierto = string.Empty; [ObservableProperty] private bool _enSesion; [ObservableProperty] - private int _totalAlumnos; - - [ObservableProperty] - private int _presentes; - - [ObservableProperty] - private int _tardanzas; - - [ObservableProperty] - private int _ausentes; + private string _inputRutAlumno = string.Empty; [ObservableProperty] private string _mensajeEstado = string.Empty; - public ObservableCollection Alumnos { get; } = new(); + [ObservableProperty] + private string _mensajeError = string.Empty; - public AsistenciaViewModel(AsistenciaService asistenciaService, AuthService authService, CursoAbierto curso, MainWindowViewModel mainVm) + [ObservableProperty] + private bool _hasError; + + public ObservableCollection AlumnosPresentes { get; } = new(); + + private int _idCursoAbierto; + + public AsistenciaViewModel(AsistenciaService asistenciaService, AuthService authService, MainWindowViewModel mainVm) { _asistenciaService = asistenciaService; _authService = authService; _mainVm = mainVm; - _curso = curso; - - NombreCurso = curso.Curso?.NombreCurso ?? "Curso"; - InfoCurso = $"{curso.Sala} | {curso.Sede} | {curso.HoraInicio} - {curso.HoraFin}"; - - _ = InitAsync(); - } - - private async Task InitAsync() - { - var sesion = await _asistenciaService.BuscarSesionActivaAsync(_curso.IdCursoAbierto); - EnSesion = sesion != null; - - var alumnos = await _asistenciaService.ObtenerAlumnosAsync(_curso.IdCursoAbierto); - var asistencias = await _asistenciaService.ObtenerAsistenciaAlumnosAsync(_curso.IdCursoAbierto); - - Alumnos.Clear(); - foreach (var alumno in alumnos) - { - var tipo = asistencias.TryGetValue(alumno.IdDetalleContrato, out var t) ? t : TipoAsistencia.Ausente; - Alumnos.Add(new AlumnoAsistenciaViewModel(alumno, tipo)); - } - - TotalAlumnos = Alumnos.Count; - ActualizarContadores(); - - MensajeEstado = EnSesion - ? "Sesion en curso - Puede registrar asistencia" - : "Inicie la sesion para registrar asistencia"; } [RelayCommand] private async Task IniciarSesionAsync() { + HasError = false; + + if (!int.TryParse(InputCursoAbierto, out var idCurso)) + { + MensajeError = "Ingrese un ID de curso valido"; + HasError = true; + return; + } + if (_authService.CurrentUser == null) return; - await _asistenciaService.IniciarSesionAsync(_curso.IdCursoAbierto, _authService.CurrentUser.RutPasaporte); + _idCursoAbierto = idCurso; + await _asistenciaService.IniciarSesionAsync(idCurso, _authService.CurrentUser.RutPasaporte, _authService.TipoAsignacionActual); EnSesion = true; - MensajeEstado = "Sesion iniciada - Registre la asistencia de los alumnos"; + MensajeEstado = $"Sesion curso {idCurso} — Ingrese RUT de alumnos presentes"; } [RelayCommand] private async Task FinalizarSesionAsync() { - var sesion = await _asistenciaService.BuscarSesionActivaAsync(_curso.IdCursoAbierto); + var sesion = await _asistenciaService.BuscarSesionActivaAsync(_idCursoAbierto); if (sesion != null) { await _asistenciaService.FinalizarSesionAsync(sesion.IdAsistenciaProfesor); } EnSesion = false; + AlumnosPresentes.Clear(); + InputCursoAbierto = string.Empty; + InputRutAlumno = string.Empty; MensajeEstado = "Sesion finalizada"; } [RelayCommand] - private async Task MarcarAlumnoAsync(AlumnoAsistenciaViewModel? alumno) + private async Task AgregarAlumnoAsync() { - if (alumno == null || !EnSesion) return; + if (!EnSesion) return; - alumno.CiclarTipoAsistencia(); - await _asistenciaService.GuardarAsistenciaAlumnoAsync(alumno.IdDetalleContrato, alumno.TipoAsistencia); - ActualizarContadores(); + HasError = false; + var rut = InputRutAlumno.Trim(); + + if (string.IsNullOrWhiteSpace(rut)) + { + MensajeError = "Ingrese el RUT del alumno"; + HasError = true; + return; + } + + if (AlumnosPresentes.Any(a => a.IdAlumno == rut)) + { + MensajeError = "Este RUT ya fue registrado"; + HasError = true; + InputRutAlumno = string.Empty; + return; + } + + var alumno = await _asistenciaService.BuscarAlumnoPorRutAsync(_idCursoAbierto, rut); + if (alumno == null) + { + MensajeError = $"RUT {rut} no encontrado en el curso"; + HasError = true; + InputRutAlumno = string.Empty; + return; + } + + await _asistenciaService.GuardarAsistenciaAlumnoAsync(alumno.IdDetalleContrato, TipoAsistencia.Presente); + + AlumnosPresentes.Add(new AlumnoPresenteViewModel + { + IdAlumno = rut, + NombreCompleto = alumno.NombreCompleto + }); + + InputRutAlumno = string.Empty; } [RelayCommand] @@ -112,56 +124,10 @@ public partial class AsistenciaViewModel : ViewModelBase { _mainVm.NavigateToDashboard(); } - - private void ActualizarContadores() - { - Presentes = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Presente); - Tardanzas = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Tardanza); - Ausentes = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Ausente); - } } -public partial class AlumnoAsistenciaViewModel : ViewModelBase +public class AlumnoPresenteViewModel { - public int IdDetalleContrato { get; } - public string NombreCompleto { get; } - - [ObservableProperty] - private int _tipoAsistencia; - - [ObservableProperty] - private string _tipoAsistenciaTexto; - - [ObservableProperty] - private string _tipoAsistenciaColor; - - public AlumnoAsistenciaViewModel(DetalleContrato alumno, int tipoInicial) - { - IdDetalleContrato = alumno.IdDetalleContrato; - NombreCompleto = alumno.NombreCompleto; - TipoAsistencia = tipoInicial; - ActualizarDisplay(); - } - - public void CiclarTipoAsistencia() - { - TipoAsistencia = TipoAsistencia switch - { - Models.TipoAsistencia.Presente => Models.TipoAsistencia.Tardanza, - Models.TipoAsistencia.Tardanza => Models.TipoAsistencia.Ausente, - _ => Models.TipoAsistencia.Presente - }; - ActualizarDisplay(); - } - - private void ActualizarDisplay() - { - TipoAsistenciaTexto = Models.TipoAsistencia.Nombre(TipoAsistencia); - TipoAsistenciaColor = TipoAsistencia switch - { - Models.TipoAsistencia.Presente => "#28A745", - Models.TipoAsistencia.Tardanza => "#FFC107", - _ => "#DC3545" - }; - } + public string IdAlumno { get; set; } = string.Empty; + public string NombreCompleto { get; set; } = string.Empty; } diff --git a/Asistencia/ViewModels/DashboardViewModel.cs b/Asistencia/ViewModels/DashboardViewModel.cs index 9ddb8ec..54a7f07 100644 --- a/Asistencia/ViewModels/DashboardViewModel.cs +++ b/Asistencia/ViewModels/DashboardViewModel.cs @@ -10,40 +10,54 @@ public partial class DashboardViewModel : ViewModelBase { private readonly AuthService _authService; private readonly AsistenciaService _asistenciaService; + private readonly SyncService _syncService; private readonly MainWindowViewModel _mainVm; [ObservableProperty] private string _nombreProfesor = string.Empty; [ObservableProperty] - private int _totalCursos; + private string _tipoAsignacion = string.Empty; - public ObservableCollection Cursos { get; } = new(); + [ObservableProperty] + private int _pendientes; - public DashboardViewModel(AuthService authService, AsistenciaService asistenciaService, MainWindowViewModel mainVm) + [ObservableProperty] + private string _mensajeSync = string.Empty; + + [ObservableProperty] + private bool _hasMensajeSync; + + public DashboardViewModel(AuthService authService, AsistenciaService asistenciaService, SyncService syncService, MainWindowViewModel mainVm) { _authService = authService; _asistenciaService = asistenciaService; + _syncService = syncService; _mainVm = mainVm; - NombreProfesor = authService.CurrentUser?.Nombre ?? ""; - _ = LoadCursosAsync(); + NombreProfesor = authService.CurrentUser?.NombreCompleto ?? ""; + TipoAsignacion = authService.TipoAsignacionActual == 1 ? "Titular" : "Reemplazo"; + _ = CargarPendientesAsync(); } - private async Task LoadCursosAsync() + private async Task CargarPendientesAsync() { - if (_authService.CurrentUser == null) return; - - var cursos = await _asistenciaService.ObtenerCursosProfesorAsync(_authService.CurrentUser.RutPasaporte); - Cursos.Clear(); - foreach (var c in cursos) Cursos.Add(c); - TotalCursos = Cursos.Count; + Pendientes = await _syncService.ContarPendientesAsync(); } [RelayCommand] - private void AbrirAsistencia(CursoAbierto? curso) + private void AbrirAsistencia() { - if (curso != null) - _mainVm.NavigateToAsistencia(curso); + _mainVm.NavigateToAsistencia(); + } + + [RelayCommand] + private async Task SincronizarAsync() + { + HasMensajeSync = false; + var (success, message) = await _syncService.SincronizarAsync("http://localhost:5000"); + MensajeSync = message; + HasMensajeSync = true; + await CargarPendientesAsync(); } [RelayCommand] diff --git a/Asistencia/ViewModels/LoginViewModel.cs b/Asistencia/ViewModels/LoginViewModel.cs index 37c1ab8..3e91fcb 100644 --- a/Asistencia/ViewModels/LoginViewModel.cs +++ b/Asistencia/ViewModels/LoginViewModel.cs @@ -13,7 +13,10 @@ public partial class LoginViewModel : ViewModelBase private string _rut = string.Empty; [ObservableProperty] - private string _password = string.Empty; + private bool _esTitular = true; + + [ObservableProperty] + private bool _esReemplazo; [ObservableProperty] private string _errorMessage = string.Empty; @@ -30,13 +33,24 @@ public partial class LoginViewModel : ViewModelBase _mainVm = mainVm; } + partial void OnEsTitularChanged(bool value) + { + if (value) EsReemplazo = false; + } + + partial void OnEsReemplazoChanged(bool value) + { + if (value) EsTitular = false; + } + [RelayCommand] private async Task LoginAsync() { IsLoading = true; HasError = false; - var (success, message) = await _authService.LoginAsync(Rut, Password); + var tipoAsignacion = EsTitular ? 1 : 4; + var (success, message) = await _authService.LoginAsync(Rut, tipoAsignacion); if (success) { diff --git a/Asistencia/ViewModels/MainWindowViewModel.cs b/Asistencia/ViewModels/MainWindowViewModel.cs index 28de353..c6bce4c 100644 --- a/Asistencia/ViewModels/MainWindowViewModel.cs +++ b/Asistencia/ViewModels/MainWindowViewModel.cs @@ -13,6 +13,7 @@ public partial class MainWindowViewModel : ViewModelBase private readonly AuthService _authService; private readonly AsistenciaService _asistenciaService; private readonly ConnectivityService _connectivityService; + private readonly SyncService _syncService; private object? _currentView; [ObservableProperty] @@ -30,11 +31,12 @@ public partial class MainWindowViewModel : ViewModelBase set => SetProperty(ref _currentView, value); } - public MainWindowViewModel(AuthService authService, AsistenciaService asistenciaService, ConnectivityService connectivityService) + public MainWindowViewModel(AuthService authService, AsistenciaService asistenciaService, ConnectivityService connectivityService, SyncService syncService) { _authService = authService; _asistenciaService = asistenciaService; _connectivityService = connectivityService; + _syncService = syncService; _ = VerificarConexionAsync(); } @@ -64,13 +66,13 @@ public partial class MainWindowViewModel : ViewModelBase public void NavigateToDashboard() { CurrentViewTitle = "Panel Principal"; - CurrentView = new DashboardViewModel(_authService, _asistenciaService, this); + CurrentView = new DashboardViewModel(_authService, _asistenciaService, _syncService, this); } - public void NavigateToAsistencia(CursoAbierto curso) + public void NavigateToAsistencia() { CurrentViewTitle = "Asistencia"; - CurrentView = new AsistenciaViewModel(_asistenciaService, _authService, curso, this); + CurrentView = new AsistenciaViewModel(_asistenciaService, _authService, this); } public void NavigateToPerfil() diff --git a/Asistencia/Views/AsistenciaView.axaml b/Asistencia/Views/AsistenciaView.axaml index 4a3f475..4e7007a 100644 --- a/Asistencia/Views/AsistenciaView.axaml +++ b/Asistencia/Views/AsistenciaView.axaml @@ -4,130 +4,109 @@ x:Class="Asistencia.Views.AsistenciaView" x:DataType="vm:AsistenciaViewModel"> - - - - - + + + + + + + + + - - - - - + diff --git a/Asistencia/Views/AsistenciaView.axaml.cs b/Asistencia/Views/AsistenciaView.axaml.cs index b36721b..0b5da52 100644 --- a/Asistencia/Views/AsistenciaView.axaml.cs +++ b/Asistencia/Views/AsistenciaView.axaml.cs @@ -1,5 +1,6 @@ using Avalonia.Controls; -using Avalonia.Markup.Xaml; +using Avalonia.Input; +using Asistencia.ViewModels; namespace Asistencia.Views; @@ -9,4 +10,12 @@ public partial class AsistenciaView : UserControl { InitializeComponent(); } + + private void OnRutAlumnoKeyDown(object? sender, KeyEventArgs e) + { + if (e.Key == Key.Return && DataContext is AsistenciaViewModel vm) + { + vm.AgregarAlumnoCommand.Execute(null); + } + } } diff --git a/Asistencia/Views/DashboardView.axaml b/Asistencia/Views/DashboardView.axaml index 329b8ef..a5eb8f5 100644 --- a/Asistencia/Views/DashboardView.axaml +++ b/Asistencia/Views/DashboardView.axaml @@ -1,7 +1,6 @@ @@ -10,18 +9,19 @@ - + - + @@ -35,55 +35,38 @@ - +