From 792992a67d6866b095b343e12be254391809a14c Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 3 Sep 2026 08:18:55 +0200 Subject: [PATCH] cambios del dia 02/08 --- .../Pages/PlanificadorRutas.CicloVidaYMapa.cs | 4 +- .../Pages/PlanificadorRutas.Estado.cs | 8 +- .../Pages/PlanificadorRutas.Historial.cs | 33 +++- .../Pages/PlanificadorRutas.Itinerarios.cs | 175 +++++++++++++----- .../Pages/PlanificadorRutas.Persistencia.cs | 26 ++- .../Pages/PlanificadorRutas.Renderizado.cs | 50 +++-- .../Components/Pages/PlanificadorRutas.razor | 133 +++++++++---- .../Components/SelectorColorSimple.razor | 4 +- RutasDBUS/wwwroot/app.css | 94 ++++++++++ 9 files changed, 425 insertions(+), 102 deletions(-) diff --git a/RutasDBUS/Components/Pages/PlanificadorRutas.CicloVidaYMapa.cs b/RutasDBUS/Components/Pages/PlanificadorRutas.CicloVidaYMapa.cs index c7059e9..2b73f53 100644 --- a/RutasDBUS/Components/Pages/PlanificadorRutas.CicloVidaYMapa.cs +++ b/RutasDBUS/Components/Pages/PlanificadorRutas.CicloVidaYMapa.cs @@ -54,6 +54,7 @@ public partial class PlanificadorRutas : ComponentBase, IDisposable try { await JS.InvokeVoidAsync("rt.initMobileMapControls"); } catch (Exception ex) { Console.WriteLine("rt.initMobileMapControls: " + ex); } try { await JS.InvokeVoidAsync("rt.initDraggablePopups"); } catch (Exception ex) { Console.WriteLine("rt.initDraggablePopups: " + ex); } await CargarConfiguracionLocalAsync(); + await CargarPreferenciaParametrosActualesHistorialAsync(); await AsegurarHistorialLocalCargadoAsync(); await CargarHistorialCompartidoAsync(); await CargarModelosHorariosAsync(); @@ -215,8 +216,6 @@ public partial class PlanificadorRutas : ComponentBase, IDisposable return; } - QuitarSalidasParadaActivasPorClaves(claves); - foreach (var clave in claves) { if (!_itPreviewIdsPorClave.TryGetValue(clave, out var ids) || ids.Count == 0) @@ -255,7 +254,6 @@ public partial class PlanificadorRutas : ComponentBase, IDisposable _itPreviewActivos.Clear(); _itPreviewIdsPorClave.Clear(); - _salidasParadaItinerariosActivas.Clear(); LimpiarParadasItinerarioVisibles(); _previewLineasActivas.Clear(); // <- esto ya lo usas para los "full_..." diff --git a/RutasDBUS/Components/Pages/PlanificadorRutas.Estado.cs b/RutasDBUS/Components/Pages/PlanificadorRutas.Estado.cs index 003a2a9..6b5c944 100644 --- a/RutasDBUS/Components/Pages/PlanificadorRutas.Estado.cs +++ b/RutasDBUS/Components/Pages/PlanificadorRutas.Estado.cs @@ -55,8 +55,10 @@ public partial class PlanificadorRutas : ComponentBase private const double UmbralPendienteSubidaRutaPorDefecto = 2.0; private const double UmbralPendienteSubidaMediaRutaPorDefecto = 5.0; private const double UmbralPendienteSubidaFuerteRutaPorDefecto = 10.0; - private const string ColorPendienteSubidaSuaveRutaPorDefecto = "#ec4899"; - private const string ColorPendienteSubidaMediaRutaPorDefecto = "#2563eb"; + private const string ColorPendienteBajadaRutaPorDefecto = "#9ebdff"; + private const string ColorPendienteLlanoRutaPorDefecto = "#166534"; + private const string ColorPendienteSubidaSuaveRutaPorDefecto = "#dc2626"; + private const string ColorPendienteSubidaMediaRutaPorDefecto = "#7c3aed"; private const string ColorPendienteSubidaFuerteRutaPorDefecto = "#000000"; private const double UmbralPendienteBajadaRutaPorDefecto = 5.0; private const double UmbralAlturaAlertaPendienteRutaMetrosPorDefecto = 6.0; @@ -375,6 +377,8 @@ public partial class PlanificadorRutas : ComponentBase private double _umbralPendienteSubidaRuta = UmbralPendienteSubidaRutaPorDefecto; private double _umbralPendienteSubidaMediaRuta = UmbralPendienteSubidaMediaRutaPorDefecto; private double _umbralPendienteSubidaFuerteRuta = UmbralPendienteSubidaFuerteRutaPorDefecto; + private string _colorPendienteBajadaRuta = ColorPendienteBajadaRutaPorDefecto; + private string _colorPendienteLlanoRuta = ColorPendienteLlanoRutaPorDefecto; private string _colorPendienteSubidaSuaveRuta = ColorPendienteSubidaSuaveRutaPorDefecto; private string _colorPendienteSubidaMediaRuta = ColorPendienteSubidaMediaRutaPorDefecto; private string _colorPendienteSubidaFuerteRuta = ColorPendienteSubidaFuerteRutaPorDefecto; diff --git a/RutasDBUS/Components/Pages/PlanificadorRutas.Historial.cs b/RutasDBUS/Components/Pages/PlanificadorRutas.Historial.cs index 9e88a77..e8fc0c4 100644 --- a/RutasDBUS/Components/Pages/PlanificadorRutas.Historial.cs +++ b/RutasDBUS/Components/Pages/PlanificadorRutas.Historial.cs @@ -12,6 +12,8 @@ public partial class PlanificadorRutas { private const string ClaveHistorialLocal = "rutasdbus.planificador.routeHistory.v1"; private const string ClaveRespaldoHistorialLocal = "rutasdbus.planificador.routeHistory.recovery.v1"; + private const string ClavePreferenciaParametrosActualesHistorial = + "rutasdbus.planificador.history.useCurrentConfig.v1"; private const int MaxItemsHistorialLocal = 25; private const int MaxBytesHistorialLocal = 24 * 1024; private const int IntervaloRefrescoHistorialCompartidoSegundos = 3; @@ -875,6 +877,7 @@ public partial class PlanificadorRutas _configuracionParametrosActualesHistorial = CrearConfiguracionLocal(); _usarParametrosActualesHistorial = usarParametrosActuales; + await PersistirPreferenciaParametrosActualesHistorialAsync(); if (usarParametrosActuales && _configuracionParametrosActualesHistorial is not null) AplicarConfiguracionLocal(_configuracionParametrosActualesHistorial); @@ -903,6 +906,35 @@ public partial class PlanificadorRutas } } + private async Task CargarPreferenciaParametrosActualesHistorialAsync() + { + try + { + var valor = await JS.InvokeAsync( + "rt.loadLocalValue", + ClavePreferenciaParametrosActualesHistorial); + if (bool.TryParse(valor, out var usarConfiguracionActual)) + _usarParametrosActualesHistorial = usarConfiguracionActual; + } + catch (JSException) + { + } + } + + private async Task PersistirPreferenciaParametrosActualesHistorialAsync() + { + try + { + await JS.InvokeVoidAsync( + "rt.saveLocalValue", + ClavePreferenciaParametrosActualesHistorial, + _usarParametrosActualesHistorial.ToString(CultureInfo.InvariantCulture)); + } + catch (JSException) + { + } + } + private bool PrepararDerivacionHistorialParaRecalculo() { var procedeDeHistorial = _tipoReferenciaHistorial != TipoReferenciaHistorial.Ninguna && @@ -1488,7 +1520,6 @@ public partial class PlanificadorRutas var configuracionPrevia = _configuracionTemporalPreviaHistorial; _configuracionTemporalPreviaHistorial = null; _configuracionParametrosActualesHistorial = null; - _usarParametrosActualesHistorial = true; if (configuracionPrevia is null) return; diff --git a/RutasDBUS/Components/Pages/PlanificadorRutas.Itinerarios.cs b/RutasDBUS/Components/Pages/PlanificadorRutas.Itinerarios.cs index bc8bde3..df497d5 100644 --- a/RutasDBUS/Components/Pages/PlanificadorRutas.Itinerarios.cs +++ b/RutasDBUS/Components/Pages/PlanificadorRutas.Itinerarios.cs @@ -296,8 +296,84 @@ public partial class PlanificadorRutas : ComponentBase /// /// Alterna desde el popup de parada el itinerario asociado a una salida. /// - private readonly Dictionary _salidasParadaItinerariosActivas = - new(StringComparer.OrdinalIgnoreCase); + private bool _procesandoTodosItinerariosParada; + private bool _ocultandoTodosItinerariosParada; + + private bool TodosItinerariosParadaPintados + { + get + { + var itinerarios = ObtenerItinerariosUnicosParada(); + return itinerarios.Count > 0 && itinerarios.All(EstaItinerarioPintado); + } + } + + private string TextoBotonTodosItinerariosParada => _procesandoTodosItinerariosParada + ? (_ocultandoTodosItinerariosParada ? "Ocultando..." : "Pintando...") + : (TodosItinerariosParadaPintados ? "Ocultar todos" : "Ver todos"); + + private List ObtenerItinerariosUnicosParada() + { + var clavesUnicas = new HashSet(StringComparer.OrdinalIgnoreCase); + var itinerariosUnicos = new List(); + + foreach (var salida in NextDepsOrdenados.ToList()) + { + var itinerario = ObtenerItinerarioSalidaParada(salida); + if (itinerario is null || itinerario.Variantes.Count == 0) + continue; + + var clave = ItClave(itinerario.Variantes[0]); + if (clavesUnicas.Add(clave)) + itinerariosUnicos.Add(itinerario); + } + + return itinerariosUnicos; + } + + private async Task ToggleTodosItinerariosParadaAsync() + { + if (_procesandoTodosItinerariosParada) + return; + + var itinerariosUnicos = ObtenerItinerariosUnicosParada(); + if (itinerariosUnicos.Count == 0) + return; + + var ocultarTodos = itinerariosUnicos.All(EstaItinerarioPintado); + _procesandoTodosItinerariosParada = true; + _ocultandoTodosItinerariosParada = ocultarTodos; + StateHasChanged(); + + try + { + if (ocultarTodos) + { + foreach (var itinerario in itinerariosUnicos) + await QuitarItItemAsync(itinerario); + + return; + } + + var coordenadas = new List(); + foreach (var itinerario in itinerariosUnicos) + { + if (!EstaItinerarioPintado(itinerario)) + await PintarItItemAsync(itinerario); + + coordenadas.AddRange(ConstruirCoordenadasItinerario(itinerario)); + } + + if (coordenadas.Count > 0) + await FitRoutesJsAsync(coordenadas); + } + finally + { + _procesandoTodosItinerariosParada = false; + _ocultandoTodosItinerariosParada = false; + StateHasChanged(); + } + } private async Task ToggleItinerarioSalidaParadaAsync(ProximaSalidaVm salida) { @@ -305,26 +381,16 @@ public partial class PlanificadorRutas : ComponentBase if (itinerario is null) return; - var salidaId = CrearIdSalidaParada(salida); - var claveItinerario = ItClave(itinerario.Variantes[0]); - var esSalidaActiva = _salidasParadaItinerariosActivas.TryGetValue(salidaId, out var claveActiva) && - string.Equals(claveActiva, claveItinerario, StringComparison.OrdinalIgnoreCase); var estaPintado = EstaItinerarioPintado(itinerario); - if (esSalidaActiva && estaPintado) + if (estaPintado) { await QuitarItItemAsync(itinerario); } else { - if (!estaPintado) - { - await PintarItItemAsync(itinerario); - await FitRoutesJsAsync(ConstruirCoordenadasItinerario(itinerario)); - } - - QuitarSalidasParadaActivasPorClaves([claveItinerario]); - _salidasParadaItinerariosActivas[salidaId] = claveItinerario; + await PintarItItemAsync(itinerario); + await FitRoutesJsAsync(ConstruirCoordenadasItinerario(itinerario)); } if (_itItemsFiltrados.Any(x => x.Id.Equals(itinerario.Id, StringComparison.OrdinalIgnoreCase))) @@ -339,31 +405,45 @@ public partial class PlanificadorRutas : ComponentBase private bool EstaItinerarioSalidaParadaPintado(ProximaSalidaVm salida) { var itinerario = ObtenerItinerarioSalidaParada(salida); - return itinerario is not null && - _salidasParadaItinerariosActivas.TryGetValue(CrearIdSalidaParada(salida), out var claveActiva) && - itinerario.Variantes.Any(variante => - string.Equals(claveActiva, ItClave(variante), StringComparison.OrdinalIgnoreCase)) && - EstaItinerarioPintado(itinerario); + return itinerario is not null && EstaItinerarioPintado(itinerario); } - private void QuitarSalidasParadaActivasPorClaves(IEnumerable claves) + private string ObtenerTextoVisibleSalidaParada(ProximaSalidaVm salida) { - var clavesAEliminar = new HashSet(claves, StringComparer.OrdinalIgnoreCase); - foreach (var salidaId in _salidasParadaItinerariosActivas - .Where(x => clavesAEliminar.Contains(x.Value)) - .Select(x => x.Key) - .ToList()) + var texto = salida.LineaTxt?.Trim() ?? string.Empty; + var separadorDestino = texto.IndexOf(" - ", StringComparison.Ordinal); + var codigo = separadorDestino > 0 ? texto[..separadorDestino].Trim() : texto; + + var itinerario = ObtenerItinerarioSalidaParada(salida); + var nombreLinea = itinerario?.Variantes.FirstOrDefault()?.Linea.Nombre?.Trim(); + if (string.IsNullOrWhiteSpace(nombreLinea) && + separadorDestino >= 0 && + separadorDestino + 3 < texto.Length) { - _salidasParadaItinerariosActivas.Remove(salidaId); + nombreLinea = texto[(separadorDestino + 3)..].Trim(); } + + return string.IsNullOrWhiteSpace(nombreLinea) + ? codigo + : $"{codigo} ({nombreLinea})"; } - private static string CrearIdSalidaParada(ProximaSalidaVm salida) - => string.Join('|', - salida.ExpId, - salida.RutaId, - salida.Hora, - salida.ItinerarioClave); + private string ObtenerNombreDestinoSalidaParada(ProximaSalidaVm salida) + { + var itinerario = ObtenerItinerarioSalidaParada(salida); + if (itinerario?.Variantes.Count > 0) + { + var destino = ObtenerNombreDestinoItinerario(itinerario.Variantes[0]); + if (!string.IsNullOrWhiteSpace(destino)) + return destino; + } + + var texto = salida.LineaTxt?.Trim() ?? string.Empty; + var separadorDestino = texto.IndexOf(" - ", StringComparison.Ordinal); + return separadorDestino >= 0 && separadorDestino + 3 < texto.Length + ? texto[(separadorDestino + 3)..].Trim() + : string.Empty; + } private bool EstaItinerarioPintado(ElementoItinerario itinerario) => itinerario.Variantes.Any(variante => @@ -1309,7 +1389,7 @@ public partial class PlanificadorRutas : ComponentBase private bool _elevPopupMinimizado = false; - private const string _versionApp = "(v-20260901a)"; + private const string _versionApp = "(v-20260902d)"; private double? _paradaElevIdee; @@ -1438,28 +1518,35 @@ public partial class PlanificadorRutas : ComponentBase } /// - /// Obtiene texto itinerario clicado. + /// Obtiene el codigo y el nombre de la linea del itinerario clicado. /// - private string GetTextoItinerarioClicado() + private string GetTextoLineaItinerarioClicado(InfoVariante? vReal) { if (_itinerarioClicado is null) return ""; - var vReal = GetVarianteRealClicada(); if (vReal is null) return _itinerarioClicado.Text; var linea = vReal.Linea?.Codigo?.ToString() ?? "?"; var itin = vReal.CodigoItinerario; var sentido = NormalizarSentidoCodigo(vReal.Sentido?.Codigo); // I / V - var nombre = vReal.Linea?.Nombre ?? ""; - var trayecto = ConstruirTextoRecorridoVariante(vReal); + var nombre = vReal.Linea?.Nombre?.Trim() ?? ""; + var codigo = $"{linea}.{itin}-{sentido}"; - if (!string.IsNullOrWhiteSpace(trayecto)) - return $"{linea}.{itin}-{sentido} — {trayecto}"; - - // ✅ Siempre devuelve el texto del sentido pinchado, no "I+V" - return $"{linea}.{itin}-{sentido} — {nombre}"; + return string.IsNullOrWhiteSpace(nombre) + ? codigo + : $"{codigo} ({nombre})"; + } + + /// + /// Obtiene la parada final del itinerario clicado. + /// + private string GetDestinoItinerarioClicado(InfoVariante? vReal) + { + return vReal is null + ? "" + : ObtenerNombreDestinoItinerario(vReal); } /// diff --git a/RutasDBUS/Components/Pages/PlanificadorRutas.Persistencia.cs b/RutasDBUS/Components/Pages/PlanificadorRutas.Persistencia.cs index 58e30e4..a144813 100644 --- a/RutasDBUS/Components/Pages/PlanificadorRutas.Persistencia.cs +++ b/RutasDBUS/Components/Pages/PlanificadorRutas.Persistencia.cs @@ -11,7 +11,7 @@ public partial class PlanificadorRutas private const int VersionPersistenciaFactorPenalizacionPie = 1; private const int VersionPersistenciaFactorEquilibrado = 2; private const int VersionPersistenciaPendientes = 2; - private const int VersionPersistenciaColoresPendientes = 1; + private const int VersionPersistenciaColoresPendientes = 2; private const int VersionPersistenciaCoeficienteEsfuerzo = 1; private const int VersionPersistenciaFuenteElevacion = 1; private bool _configuracionLocalCargada = false; @@ -55,6 +55,8 @@ public partial class PlanificadorRutas public double? UmbralPendienteSubidaRuta { get; set; } public double? UmbralPendienteSubidaMediaRuta { get; set; } public double? UmbralPendienteSubidaFuerteRuta { get; set; } + public string? ColorPendienteBajadaRuta { get; set; } + public string? ColorPendienteLlanoRuta { get; set; } public string? ColorPendienteSubidaSuaveRuta { get; set; } public string? ColorPendienteSubidaMediaRuta { get; set; } public string? ColorPendienteSubidaFuerteRuta { get; set; } @@ -180,6 +182,8 @@ public partial class PlanificadorRutas UmbralPendienteSubidaRuta = _umbralPendienteSubidaRuta, UmbralPendienteSubidaMediaRuta = _umbralPendienteSubidaMediaRuta, UmbralPendienteSubidaFuerteRuta = _umbralPendienteSubidaFuerteRuta, + ColorPendienteBajadaRuta = _colorPendienteBajadaRuta, + ColorPendienteLlanoRuta = _colorPendienteLlanoRuta, ColorPendienteSubidaSuaveRuta = _colorPendienteSubidaSuaveRuta, ColorPendienteSubidaMediaRuta = _colorPendienteSubidaMediaRuta, ColorPendienteSubidaFuerteRuta = _colorPendienteSubidaFuerteRuta, @@ -295,6 +299,18 @@ public partial class PlanificadorRutas : UmbralPendienteSubidaFuerteRutaPorDefecto; var migrarColoresPendientes = (config.VersionColoresPendientes ?? 0) < VersionPersistenciaColoresPendientes; + _colorPendienteBajadaRuta = migrarColoresPendientes + ? ColorPendienteBajadaRutaPorDefecto + : NormalizarColorHexRuta( + config.ColorPendienteBajadaRuta, + ColorPendienteBajadaRutaPorDefecto); + if (string.Equals(_colorPendienteBajadaRuta, "#2563eb", StringComparison.OrdinalIgnoreCase)) + _colorPendienteBajadaRuta = ColorPendienteBajadaRutaPorDefecto; + _colorPendienteLlanoRuta = migrarColoresPendientes + ? ColorPendienteLlanoRutaPorDefecto + : NormalizarColorHexRuta( + config.ColorPendienteLlanoRuta, + ColorPendienteLlanoRutaPorDefecto); _colorPendienteSubidaSuaveRuta = migrarColoresPendientes ? ColorPendienteSubidaSuaveRutaPorDefecto : NormalizarColorHexRuta( @@ -442,6 +458,8 @@ public partial class PlanificadorRutas _umbralPendienteSubidaRuta = UmbralPendienteSubidaRutaPorDefecto; _umbralPendienteSubidaMediaRuta = UmbralPendienteSubidaMediaRutaPorDefecto; _umbralPendienteSubidaFuerteRuta = UmbralPendienteSubidaFuerteRutaPorDefecto; + _colorPendienteBajadaRuta = ColorPendienteBajadaRutaPorDefecto; + _colorPendienteLlanoRuta = ColorPendienteLlanoRutaPorDefecto; _colorPendienteSubidaSuaveRuta = ColorPendienteSubidaSuaveRutaPorDefecto; _colorPendienteSubidaMediaRuta = ColorPendienteSubidaMediaRutaPorDefecto; _colorPendienteSubidaFuerteRuta = ColorPendienteSubidaFuerteRutaPorDefecto; @@ -457,6 +475,7 @@ public partial class PlanificadorRutas _nivelBrilloMapa = 0; _usarColorRealLineaEnItinerarios = false; _usarOsrmParaRanking = false; + _usarParametrosActualesHistorial = true; if (_usarHoraSimulada) StopClock(); @@ -466,6 +485,7 @@ public partial class PlanificadorRutas SincronizarSegundosPorParadaConHorarios(); await RefrescarHoraUIAsync(); await PersistirConfiguracionAsync(); + await PersistirPreferenciaParametrosActualesHistorialAsync(); StateHasChanged(); } @@ -500,6 +520,8 @@ public partial class PlanificadorRutas _umbralPendienteSubidaRuta = UmbralPendienteSubidaRutaPorDefecto; _umbralPendienteSubidaMediaRuta = UmbralPendienteSubidaMediaRutaPorDefecto; _umbralPendienteSubidaFuerteRuta = UmbralPendienteSubidaFuerteRutaPorDefecto; + _colorPendienteBajadaRuta = ColorPendienteBajadaRutaPorDefecto; + _colorPendienteLlanoRuta = ColorPendienteLlanoRutaPorDefecto; _colorPendienteSubidaSuaveRuta = ColorPendienteSubidaSuaveRutaPorDefecto; _colorPendienteSubidaMediaRuta = ColorPendienteSubidaMediaRutaPorDefecto; _colorPendienteSubidaFuerteRuta = ColorPendienteSubidaFuerteRutaPorDefecto; @@ -515,6 +537,7 @@ public partial class PlanificadorRutas _nivelBrilloMapa = 0; _usarColorRealLineaEnItinerarios = false; _usarOsrmParaRanking = false; + _usarParametrosActualesHistorial = true; if (_usarHoraSimulada) StopClock(); @@ -524,6 +547,7 @@ public partial class PlanificadorRutas SincronizarSegundosPorParadaConHorarios(); await RefrescarHoraUIAsync(); await PersistirConfiguracionAsync(); + await PersistirPreferenciaParametrosActualesHistorialAsync(); StateHasChanged(); } } diff --git a/RutasDBUS/Components/Pages/PlanificadorRutas.Renderizado.cs b/RutasDBUS/Components/Pages/PlanificadorRutas.Renderizado.cs index c44a4be..d8b1d44 100644 --- a/RutasDBUS/Components/Pages/PlanificadorRutas.Renderizado.cs +++ b/RutasDBUS/Components/Pages/PlanificadorRutas.Renderizado.cs @@ -134,14 +134,16 @@ public partial class PlanificadorRutas : ComponentBase StateHasChanged(); } - private enum NivelColorSubidaRuta + private enum NivelColorPendienteRuta { - Suave, - Media, - Fuerte + Bajada, + Llano, + Subida, + SubidaMedia, + SubidaFuerte } - private NivelColorSubidaRuta? _selectorColorPendienteRuta; + private NivelColorPendienteRuta? _selectorColorPendienteRuta; private void AbrirConfiguracionPendientesRuta() { @@ -155,29 +157,37 @@ public partial class PlanificadorRutas : ComponentBase _mostrarConfiguracionPendientesRuta = false; } - private void AlternarSelectorColorPendienteRuta(NivelColorSubidaRuta nivel) + private void AlternarSelectorColorPendienteRuta(NivelColorPendienteRuta nivel) => _selectorColorPendienteRuta = _selectorColorPendienteRuta == nivel ? null : nivel; - private string ObtenerColorPendienteSubidaRuta(NivelColorSubidaRuta nivel) + private string ObtenerColorPendienteRuta(NivelColorPendienteRuta nivel) => nivel switch { - NivelColorSubidaRuta.Media => _colorPendienteSubidaMediaRuta, - NivelColorSubidaRuta.Fuerte => _colorPendienteSubidaFuerteRuta, + NivelColorPendienteRuta.Bajada => _colorPendienteBajadaRuta, + NivelColorPendienteRuta.Llano => _colorPendienteLlanoRuta, + NivelColorPendienteRuta.SubidaMedia => _colorPendienteSubidaMediaRuta, + NivelColorPendienteRuta.SubidaFuerte => _colorPendienteSubidaFuerteRuta, _ => _colorPendienteSubidaSuaveRuta }; - private async Task AplicarColorPendienteSubidaRutaAsync( + private async Task AplicarColorPendienteRutaAsync( string color, - NivelColorSubidaRuta nivel) + NivelColorPendienteRuta nivel) { - var nuevo = NormalizarColorHexRuta(color, ObtenerColorPendienteSubidaRuta(nivel)); + var nuevo = NormalizarColorHexRuta(color, ObtenerColorPendienteRuta(nivel)); switch (nivel) { - case NivelColorSubidaRuta.Media: + case NivelColorPendienteRuta.Bajada: + _colorPendienteBajadaRuta = nuevo; + break; + case NivelColorPendienteRuta.Llano: + _colorPendienteLlanoRuta = nuevo; + break; + case NivelColorPendienteRuta.SubidaMedia: _colorPendienteSubidaMediaRuta = nuevo; break; - case NivelColorSubidaRuta.Fuerte: + case NivelColorPendienteRuta.SubidaFuerte: _colorPendienteSubidaFuerteRuta = nuevo; break; default: @@ -588,9 +598,17 @@ public partial class PlanificadorRutas : ComponentBase ColorPendienteSubidaSuaveRutaPorDefecto)); if (pendientePorcentaje.Value <= -umbralBajada) - return ("bajada", "#16a34a"); + return ( + "bajada", + NormalizarColorHexRuta( + _colorPendienteBajadaRuta, + ColorPendienteBajadaRutaPorDefecto)); - return ("llano", "#dc2626"); + return ( + "llano", + NormalizarColorHexRuta( + _colorPendienteLlanoRuta, + ColorPendienteLlanoRutaPorDefecto)); } diff --git a/RutasDBUS/Components/Pages/PlanificadorRutas.razor b/RutasDBUS/Components/Pages/PlanificadorRutas.razor index b0dc62c..edf7928 100644 --- a/RutasDBUS/Components/Pages/PlanificadorRutas.razor +++ b/RutasDBUS/Components/Pages/PlanificadorRutas.razor @@ -287,18 +287,32 @@ } else { -
-
+ var todosItinerariosParadaPintados = TodosItinerariosParadaPintados; +
+
Horarios (@_nextDeps.Count)
- +
+ + + +
@if (HorariosTaxibusSimuladosVisibles) @@ -313,10 +327,18 @@ @foreach (var x in NextDepsOrdenados) { var itinerarioPintado = EstaItinerarioSalidaParadaPintado(x); + var textoItinerario = ObtenerTextoVisibleSalidaParada(x); + var destinoItinerario = ObtenerNombreDestinoSalidaParada(x);
  • - @x.Hora - @x.LineaTxt + @x.Hora - @textoItinerario + @if (!string.IsNullOrWhiteSpace(destinoItinerario)) + { + + @destinoItinerario + + } + Umbral Bajada (%) + @if (_selectorColorPendienteRuta == NivelColorPendienteRuta.Bajada) + { + + } + + +
  • + +
    + + + Andando normal + @if (_selectorColorPendienteRuta == NivelColorPendienteRuta.Llano) + { + + } + +
    +
    Umbral Subida (%) - @if (_selectorColorPendienteRuta == NivelColorSubidaRuta.Suave) + @if (_selectorColorPendienteRuta == NivelColorPendienteRuta.Subida) { + ColorChanged="@(color => AplicarColorPendienteRutaAsync(color, NivelColorPendienteRuta.Subida))" /> } + @onclick="() => AlternarSelectorColorPendienteRuta(NivelColorPendienteRuta.SubidaMedia)"> Subida Media (%) - @if (_selectorColorPendienteRuta == NivelColorSubidaRuta.Media) + @if (_selectorColorPendienteRuta == NivelColorPendienteRuta.SubidaMedia) { + ColorChanged="@(color => AplicarColorPendienteRutaAsync(color, NivelColorPendienteRuta.SubidaMedia))" /> } + @onclick="() => AlternarSelectorColorPendienteRuta(NivelColorPendienteRuta.SubidaFuerte)"> Subida Fuerte (%) - @if (_selectorColorPendienteRuta == NivelColorSubidaRuta.Fuerte) + @if (_selectorColorPendienteRuta == NivelColorPendienteRuta.SubidaFuerte) { + ColorChanged="@(color => AplicarColorPendienteRutaAsync(color, NivelColorPendienteRuta.SubidaFuerte))" /> }
    - -