fix: map disappearing in open data page

This commit is contained in:
2026-06-17 00:11:12 +02:00 Unverified
parent 71de3589e6
commit 43ea5a1d97
+32 -21
View File
@@ -14,7 +14,7 @@ const { data: openDataResponse, pending } = await useAsyncData(
) )
const visibleReports = computed(() => const visibleReports = computed(() =>
(openDataResponse.value?.reports || []).filter((report) => isWithinBariBounds(report.latitude, report.longitude)) (openDataResponse.value?.reports || []).filter((report) => isWithinBariBounds(report.latitude, report.longitude))
) )
const isLastPage = computed(() => { const isLastPage = computed(() => {
@@ -37,9 +37,12 @@ let markers: CircleMarker[] = []
const getStatusBadge = (status: string) => { const getStatusBadge = (status: string) => {
switch (status) { switch (status) {
case 'RESOLVED': return { class: 'bg-success', text: 'Risolto', icon: 'it-check-circle' } case 'RESOLVED':
case 'CLOSED': return { class: 'bg-secondary', text: 'Chiuso', icon: 'it-lock' } return { class: 'bg-success', text: 'Risolto', icon: 'it-check-circle' }
default: return { class: 'bg-info', text: status, icon: 'it-info-circle' } case 'CLOSED':
return { class: 'bg-secondary', text: 'Chiuso', icon: 'it-lock' }
default:
return { class: 'bg-info', text: status, icon: 'it-info-circle' }
} }
} }
@@ -99,8 +102,8 @@ const initMap = async () => {
const L = await loadLeaflet() const L = await loadLeaflet()
const bariBounds = L.latLngBounds( const bariBounds = L.latLngBounds(
[BARI_BOUNDS.south, BARI_BOUNDS.west], [BARI_BOUNDS.south, BARI_BOUNDS.west],
[BARI_BOUNDS.north, BARI_BOUNDS.east] [BARI_BOUNDS.north, BARI_BOUNDS.east]
) )
map = L.map(mapContainer.value, { map = L.map(mapContainer.value, {
@@ -119,9 +122,13 @@ const initMap = async () => {
watch(currentView, async (view) => { watch(currentView, async (view) => {
if (view !== 'map') return if (view !== 'map') return
await nextTick() await nextTick()
await initMap() // Inizializza la mappa se non esiste, altrimenti aggiornane solo dimensioni e dati
map?.invalidateSize() if (!map) {
await renderMapMarkers() await initMap()
} else {
map.invalidateSize()
await renderMapMarkers()
}
}) })
watch(visibleReports, async () => { watch(visibleReports, async () => {
@@ -162,7 +169,7 @@ onBeforeUnmount(() => {
:class="currentView === 'grid' ? 'btn-primary' : 'btn-outline-primary'" :class="currentView === 'grid' ? 'btn-primary' : 'btn-outline-primary'"
@click="currentView = 'grid'" @click="currentView = 'grid'"
> >
<BIIcon name="it-grid" size="sm" class="me-1" :color="currentView === 'grid' ? 'white' : 'primary'" /> <BIIcon :color="currentView === 'grid' ? 'white' : 'primary'" class="me-1" name="it-grid" size="sm"/>
Griglia Dati Griglia Dati
</button> </button>
<button <button
@@ -170,25 +177,26 @@ onBeforeUnmount(() => {
:class="currentView === 'map' ? 'btn-primary' : 'btn-outline-primary'" :class="currentView === 'map' ? 'btn-primary' : 'btn-outline-primary'"
@click="currentView = 'map'" @click="currentView = 'map'"
> >
<BIIcon name="it-map-marker" size="sm" class="me-1" :color="currentView === 'map' ? 'white' : 'primary'" /> <BIIcon :color="currentView === 'map' ? 'white' : 'primary'" class="me-1" name="it-map-marker" size="sm"/>
Mappa Mappa
</button> </button>
</div> </div>
<div class="col-12 col-md-6 text-md-end"> <div class="col-12 col-md-6 text-md-end">
<button class="btn btn-sm btn-outline-secondary" title="Scarica dataset in formato JSON"> <button class="btn btn-sm btn-outline-secondary" title="Scarica dataset in formato JSON">
<BIIcon name="it-download" size="sm" class="me-1" /> <BIIcon class="me-1" name="it-download" size="sm"/>
Scarica JSON Scarica JSON
</button> </button>
</div> </div>
</div> </div>
<!-- Sostituito v-else-if con v-show -->
<div v-if="pending" class="d-flex justify-content-center my-5 py-5"> <div v-if="pending" class="d-flex justify-content-center my-5 py-5">
<div class="progress-spinner progress-spinner-active" role="status"> <div class="progress-spinner progress-spinner-active" role="status">
<span class="visually-hidden">Caricamento in corso...</span> <span class="visually-hidden">Caricamento in corso...</span>
</div> </div>
</div> </div>
<div v-else-if="currentView === 'grid'"> <div v-show="!pending && currentView === 'grid'">
<div class="row" v-if="openDataResponse?.reports && openDataResponse.reports.length > 0"> <div class="row" v-if="openDataResponse?.reports && openDataResponse.reports.length > 0">
<div class="col-12 col-md-6 col-lg-4 mb-4" v-for="report in visibleReports" :key="report.id"> <div class="col-12 col-md-6 col-lg-4 mb-4" v-for="report in visibleReports" :key="report.id">
<div class="card-wrapper card-space h-100"> <div class="card-wrapper card-space h-100">
@@ -197,8 +205,9 @@ onBeforeUnmount(() => {
<div class="d-flex justify-content-between align-items-start mb-3"> <div class="d-flex justify-content-between align-items-start mb-3">
<div class="category-top m-0"> <div class="category-top m-0">
<span class="badge rounded-pill text-white px-3 py-1" :class="getStatusBadge(report.status).class"> <span :class="getStatusBadge(report.status).class"
<BIIcon :name="getStatusBadge(report.status).icon" size="xs" color="white" class="me-1" /> class="badge rounded-pill text-white px-3 py-1">
<BIIcon :name="getStatusBadge(report.status).icon" class="me-1" color="white" size="xs"/>
{{ getStatusBadge(report.status).text }} {{ getStatusBadge(report.status).text }}
</span> </span>
</div> </div>
@@ -208,7 +217,7 @@ onBeforeUnmount(() => {
<h3 class="card-title h5 font-weight-bold">{{ report.category_name }}</h3> <h3 class="card-title h5 font-weight-bold">{{ report.category_name }}</h3>
<p class="card-text text-muted mb-4"> <p class="card-text text-muted mb-4">
<BIIcon name="it-map-marker-circle" size="sm" class="me-1" /> <BIIcon class="me-1" name="it-map-marker-circle" size="sm"/>
{{ report.area_name || 'Area comunale non specificata' }} {{ report.area_name || 'Area comunale non specificata' }}
</p> </p>
@@ -239,7 +248,7 @@ onBeforeUnmount(() => {
<ul class="pagination"> <ul class="pagination">
<li class="page-item" :class="{ disabled: currentPage === 1 }"> <li class="page-item" :class="{ disabled: currentPage === 1 }">
<a class="page-link" href="#" tabindex="-1" aria-disabled="true" @click.prevent="prevPage"> <a class="page-link" href="#" tabindex="-1" aria-disabled="true" @click.prevent="prevPage">
<BIIcon name="it-chevron-left" size="sm" /> <BIIcon name="it-chevron-left" size="sm"/>
<span class="visually-hidden">Pagina precedente</span> <span class="visually-hidden">Pagina precedente</span>
</a> </a>
</li> </li>
@@ -249,14 +258,14 @@ onBeforeUnmount(() => {
<li class="page-item" :class="{ disabled: isLastPage }"> <li class="page-item" :class="{ disabled: isLastPage }">
<a class="page-link" href="#" @click.prevent="nextPage"> <a class="page-link" href="#" @click.prevent="nextPage">
<span class="visually-hidden">Pagina successiva</span> <span class="visually-hidden">Pagina successiva</span>
<BIIcon name="it-chevron-right" size="sm" /> <BIIcon name="it-chevron-right" size="sm"/>
</a> </a>
</li> </li>
</ul> </ul>
</nav> </nav>
</div> </div>
<div v-else-if="currentView === 'map'" class="map-view-wrapper"> <div v-show="!pending && currentView === 'map'" class="map-view-wrapper">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3"> <div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3">
<p class="text-muted mb-0">Mappa pubblica delle segnalazioni nell'area di Bari.</p> <p class="text-muted mb-0">Mappa pubblica delle segnalazioni nell'area di Bari.</p>
<span class="badge bg-light text-dark border">{{ visibleReports.length }} punti</span> <span class="badge bg-light text-dark border">{{ visibleReports.length }} punti</span>
@@ -274,13 +283,15 @@ onBeforeUnmount(() => {
.card-wrapper { .card-wrapper {
height: 100%; height: 100%;
} }
.card-bg { .card-bg {
border: 1px solid rgba(0,0,0,0.05); border: 1px solid rgba(0, 0, 0, 0.05);
transition: transform 0.2s ease, box-shadow 0.2s ease; transition: transform 0.2s ease, box-shadow 0.2s ease;
} }
.card-bg:hover { .card-bg:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(0,0,0,0.1) !important; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1) !important;
} }
.open-data-map { .open-data-map {