173 lines
5.4 KiB
HTML
173 lines
5.4 KiB
HTML
<div class="weather-app">
|
|
<!-- Menú hamburguesa -->
|
|
<div class="menu-button" (click)="toggleMenu()">
|
|
<span></span>
|
|
<span></span>
|
|
<span></span>
|
|
</div>
|
|
|
|
<!-- Panel del menú deslizante -->
|
|
<div class="menu-panel" [class.open]="menuOpen()">
|
|
<div class="menu-overlay" (click)="closeMenu()"></div>
|
|
|
|
<div class="menu-content">
|
|
<div class="menu-header">
|
|
<h2>Menú</h2>
|
|
<button class="close-button" (click)="closeMenu()">✕</button>
|
|
</div>
|
|
|
|
<!-- Última actualización -->
|
|
@if (getLastUpdateDate()) {
|
|
<div class="menu-item last-update">
|
|
<span class="label">Última actualització:</span>
|
|
<span class="value">{{ getLastUpdateDate() }}</span>
|
|
</div>
|
|
}
|
|
|
|
<!-- Botón de actualizar -->
|
|
<button class="menu-action" (click)="refresh(); closeMenu()">
|
|
🔄 Actualitzar dades
|
|
</button>
|
|
|
|
<!-- Buscador de población -->
|
|
<div class="menu-item search-section">
|
|
<label for="search-municipi">Cerca una població:</label>
|
|
<input
|
|
type="text"
|
|
id="search-municipi"
|
|
placeholder="Escriu el nom..."
|
|
[value]="searchQuery()"
|
|
(input)="onSearchInput($event)"
|
|
class="search-input"
|
|
/>
|
|
|
|
@if (searching()) {
|
|
<div class="search-loading">Cercant...</div>
|
|
}
|
|
|
|
@if (searchResults().length > 0) {
|
|
<div class="search-results">
|
|
@for (result of searchResults(); track result.codi) {
|
|
<div class="search-result" (click)="selectMunicipi(result)">
|
|
<span class="result-name">{{ result.nom }}</span>
|
|
@if (result.latitud && result.longitud) {
|
|
<span class="result-coords">{{ result.latitud.toFixed(2) }}, {{ result.longitud.toFixed(2) }}</span>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
|
|
@if (searchQuery().length >= 2 && searchResults().length === 0 && !searching()) {
|
|
<div class="no-results">No s'han trobat resultats</div>
|
|
}
|
|
</div>
|
|
|
|
<!-- Botón de ubicación GPS -->
|
|
<button class="menu-action secondary" (click)="requestLocation(); closeMenu()">
|
|
📍 Usar la meva ubicació
|
|
</button>
|
|
|
|
<!-- Botón de mapa de estaciones -->
|
|
<button class="menu-action secondary" (click)="openMap(); closeMenu()">
|
|
🗺️ Mapa d'estacions
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Modal GPS -->
|
|
@if (showGpsModal()) {
|
|
<div class="modal-overlay" (click)="rejectGpsModal()">
|
|
<div class="modal-content" (click)="$event.stopPropagation()">
|
|
<div class="modal-icon">📍</div>
|
|
<h2>Ubicació GPS</h2>
|
|
<p>Vols que l'aplicació utilitzi la teva ubicació per mostrar el temps de la teva zona?</p>
|
|
<div class="modal-actions">
|
|
<button class="modal-button secondary" (click)="rejectGpsModal()">
|
|
No, gràcies
|
|
</button>
|
|
<button class="modal-button primary" (click)="acceptGpsModal()">
|
|
Sí, activar GPS
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@if (gettingLocation()) {
|
|
<div class="loading">
|
|
<div class="spinner"></div>
|
|
<p>📍 Obtenint la teva ubicació...</p>
|
|
</div>
|
|
}
|
|
|
|
@if (locationDenied() && !loading() && !gpsPermissionAsked()) {
|
|
<div class="location-denied">
|
|
<p>⚠️ Permisos d'ubicació denegats. Mostrant el temps de Lliçà d'Amunt.</p>
|
|
<button class="location-button" (click)="requestLocation()">
|
|
📍 Activar ubicació GPS
|
|
</button>
|
|
</div>
|
|
}
|
|
|
|
@if (loading() && !gettingLocation()) {
|
|
<div class="loading">
|
|
<div class="spinner"></div>
|
|
<p>Carregant informació meteorològica...</p>
|
|
</div>
|
|
}
|
|
|
|
@if (error()) {
|
|
<div class="error">
|
|
<p>{{ error() }}</p>
|
|
<button (click)="refresh()">Tornar a intentar</button>
|
|
</div>
|
|
}
|
|
|
|
@if (!loading() && !error()) {
|
|
<div class="weather-container">
|
|
<!-- Header con ubicación y temperatura actual -->
|
|
<div class="header">
|
|
<div class="location">
|
|
<h1>{{ municipi()?.nom }}</h1>
|
|
@if (estacioInfo() && estacioInfo()!.estacio) {
|
|
<p class="station-info">
|
|
Estació: {{ estacioInfo()!.estacio.nom }}
|
|
<span class="distance">({{ estacioInfo()!.distancia }} km)</span>
|
|
</p>
|
|
}
|
|
</div>
|
|
|
|
@if (getCurrentTemperature() !== null) {
|
|
<div class="current-temp">
|
|
<span class="temperature">{{ getCurrentTemperature()?.toFixed(1) }}°</span>
|
|
</div>
|
|
}
|
|
|
|
@if (getTodayMinMax()) {
|
|
<div class="min-max">
|
|
<span>Màx: {{ getTodayMinMax()?.max?.toFixed(1) }}°</span>
|
|
<span>Mín: {{ getTodayMinMax()?.min?.toFixed(1) }}°</span>
|
|
</div>
|
|
}
|
|
</div>
|
|
|
|
<!-- Predicción horaria (scroll horizontal) -->
|
|
@if (prediccioHoraria().length > 0) {
|
|
<div class="section">
|
|
<h2>Previsió horària (48 hores)</h2>
|
|
<app-prediccio-horaria [prediccions]="prediccioHoraria()" />
|
|
</div>
|
|
}
|
|
|
|
<!-- Predicción diaria (8 días) -->
|
|
@if (prediccioDiaria().length > 0) {
|
|
<div class="section">
|
|
<h2>Previsió 8 dies</h2>
|
|
<app-prediccio-diaria [prediccions]="prediccioDiaria()" />
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|