mirror of
https://github.com/MarekWo/mc-webui.git
synced 2026-08-05 00:12:26 +02:00
fix: Map buttons not working in contacts page and message bubbles
- Add Leaflet CSS/JS and map modal to contacts_base.html - Add showContactOnMap function to contacts.js (contacts page has separate template) - Load contactsGeoCache before messages to ensure Map buttons appear on bubbles Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -204,6 +204,9 @@ document.addEventListener('DOMContentLoaded', async function() {
|
||||
// This ensures channels are available for checkForUpdates()
|
||||
await loadChannels();
|
||||
|
||||
// Load contacts geo cache BEFORE messages (needed for Map buttons on bubbles)
|
||||
await loadContactsGeoCache();
|
||||
|
||||
// Now load other data (can run in parallel)
|
||||
loadArchiveList();
|
||||
loadMessages();
|
||||
@@ -212,9 +215,6 @@ document.addEventListener('DOMContentLoaded', async function() {
|
||||
updatePendingContactsBadge();
|
||||
loadStatus();
|
||||
|
||||
// Load contacts geo cache for map buttons on messages
|
||||
loadContactsGeoCache();
|
||||
|
||||
// Map button in menu
|
||||
const mapBtn = document.getElementById('mapBtn');
|
||||
if (mapBtn) {
|
||||
|
||||
@@ -50,6 +50,59 @@ let contactToDelete = null;
|
||||
let sortBy = 'last_advert'; // 'name' or 'last_advert'
|
||||
let sortOrder = 'desc'; // 'asc' or 'desc'
|
||||
|
||||
// Map state (Leaflet)
|
||||
let leafletMap = null;
|
||||
let markersGroup = null;
|
||||
|
||||
// =============================================================================
|
||||
// Leaflet Map Functions
|
||||
// =============================================================================
|
||||
|
||||
/**
|
||||
* Initialize Leaflet map (called once on first modal open)
|
||||
*/
|
||||
function initLeafletMap() {
|
||||
if (leafletMap) return;
|
||||
|
||||
leafletMap = L.map('leafletMap').setView([52.0, 19.0], 6);
|
||||
|
||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
attribution: '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a>'
|
||||
}).addTo(leafletMap);
|
||||
|
||||
markersGroup = L.layerGroup().addTo(leafletMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show single contact on map
|
||||
*/
|
||||
function showContactOnMap(name, lat, lon) {
|
||||
const modalEl = document.getElementById('mapModal');
|
||||
const modal = new bootstrap.Modal(modalEl);
|
||||
document.getElementById('mapModalTitle').textContent = name;
|
||||
|
||||
const onShown = function() {
|
||||
initLeafletMap();
|
||||
markersGroup.clearLayers();
|
||||
|
||||
L.marker([lat, lon])
|
||||
.addTo(markersGroup)
|
||||
.bindPopup(`<b>${name}</b>`)
|
||||
.openPopup();
|
||||
|
||||
leafletMap.setView([lat, lon], 13);
|
||||
leafletMap.invalidateSize();
|
||||
|
||||
modalEl.removeEventListener('shown.bs.modal', onShown);
|
||||
};
|
||||
|
||||
modalEl.addEventListener('shown.bs.modal', onShown);
|
||||
modal.show();
|
||||
}
|
||||
|
||||
// Make showContactOnMap available globally
|
||||
window.showContactOnMap = showContactOnMap;
|
||||
|
||||
// =============================================================================
|
||||
// Initialization
|
||||
// =============================================================================
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
<!-- Bootstrap Icons -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.2/font/bootstrap-icons.css">
|
||||
|
||||
<!-- Leaflet CSS -->
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
|
||||
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
|
||||
crossorigin="" />
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
|
||||
|
||||
@@ -410,9 +415,29 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Map Modal (Leaflet) -->
|
||||
<div class="modal fade" id="mapModal" tabindex="-1">
|
||||
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title"><i class="bi bi-geo-alt"></i> <span id="mapModalTitle">Map</span></h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<div class="modal-body p-0">
|
||||
<div id="leafletMap" style="height: 400px; width: 100%;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bootstrap 5 JS Bundle -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
<!-- Leaflet JS -->
|
||||
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
|
||||
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
|
||||
crossorigin=""></script>
|
||||
|
||||
<!-- Contact Management JavaScript -->
|
||||
<script src="{{ url_for('static', filename='js/contacts.js') }}"></script>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user