Fixed spatial issues with finding map cuts data.

This commit is contained in:
admin 2025-09-10 20:57:07 -06:00
parent ebf9ff23ab
commit 006cbcf9c3
5 changed files with 48 additions and 129 deletions

View File

@ -383,8 +383,8 @@ class CutsController {
return res.status(404).json({ error: 'Cut not found' }); return res.status(404).json({ error: 'Cut not found' });
} }
// Get all locations // Get all locations (use paginated to get ALL records, not just first page)
const locationsResponse = await nocodbService.getAll(config.LOCATIONS_TABLE_ID); const locationsResponse = await nocodbService.getAllPaginated(config.LOCATIONS_TABLE_ID);
if (!locationsResponse || !locationsResponse.list) { if (!locationsResponse || !locationsResponse.list) {
return res.json({ locations: [], statistics: { total_locations: 0 } }); return res.json({ locations: [], statistics: { total_locations: 0 } });
} }
@ -448,8 +448,8 @@ class CutsController {
return res.status(403).json({ error: 'Export is disabled for this cut' }); return res.status(403).json({ error: 'Export is disabled for this cut' });
} }
// Get all locations // Get all locations (use paginated to get ALL records, not just first page)
const locationsResponse = await nocodbService.getAll(config.LOCATIONS_TABLE_ID); const locationsResponse = await nocodbService.getAllPaginated(config.LOCATIONS_TABLE_ID);
if (!locationsResponse || !locationsResponse.list) { if (!locationsResponse || !locationsResponse.list) {
return res.json({ locations: [] }); return res.json({ locations: [] });
} }
@ -586,8 +586,8 @@ class CutsController {
return res.status(404).json({ error: 'Cut not found' }); return res.status(404).json({ error: 'Cut not found' });
} }
// Get all locations // Get all locations (use paginated to get ALL records, not just first page)
const locationsResponse = await nocodbService.getAll(config.LOCATIONS_TABLE_ID); const locationsResponse = await nocodbService.getAllPaginated(config.LOCATIONS_TABLE_ID);
if (!locationsResponse || !locationsResponse.list) { if (!locationsResponse || !locationsResponse.list) {
return res.json({ return res.json({
statistics: { total_locations: 0 }, statistics: { total_locations: 0 },

View File

@ -1,110 +0,0 @@
/**
* Admin Cuts Management Module
* Main initialization file that imports and orchestrates all cut management modules
*/
// Global admin cuts manager instance
let adminCutsManager = null;
// Initialize the admin cuts system when DOM is ready
document.addEventListener('DOMContentLoaded', async function() {
console.log('DOM loaded, initializing admin cuts system...');
try {
// Wait for all module classes to be loaded
if (typeof AdminCutsManager === 'undefined') {
console.error('AdminCutsManager class not loaded');
return;
}
if (typeof CutDrawing === 'undefined') {
console.error('CutDrawing class not loaded');
return;
}
if (typeof CutLocationManager === 'undefined') {
console.error('CutLocationManager class not loaded');
return;
}
if (typeof CutPrintUtils === 'undefined') {
console.error('CutPrintUtils class not loaded');
return;
}
// Create manager instance
adminCutsManager = new AdminCutsManager();
// Initialize the system
await adminCutsManager.initialize();
console.log('Admin cuts system initialized successfully');
// Make manager globally accessible for debugging
window.adminCutsManager = adminCutsManager;
} catch (error) {
console.error('Failed to initialize admin cuts system:', error);
// Show error notification if available
if (typeof showNotification === 'function') {
showNotification('Failed to initialize cuts management system', 'error');
}
}
});
// Global functions for backward compatibility
function startDrawing() {
if (adminCutsManager && adminCutsManager.cutDrawing) {
adminCutsManager.handleStartDrawing();
}
}
function finishDrawing() {
if (adminCutsManager && adminCutsManager.cutDrawing) {
adminCutsManager.cutDrawing.finishDrawing();
}
}
function cancelDrawing() {
if (adminCutsManager && adminCutsManager.cutDrawing) {
adminCutsManager.cutDrawing.cancelDrawing();
}
}
function resetForm() {
if (adminCutsManager) {
adminCutsManager.resetForm();
}
}
function exportCuts() {
if (adminCutsManager) {
adminCutsManager.exportCuts();
}
}
function refreshCuts() {
if (adminCutsManager) {
adminCutsManager.loadCuts();
}
}
// Debug functions
function debugFormState() {
if (adminCutsManager) {
adminCutsManager.debugFormState();
}
}
function debugOpacityState() {
if (adminCutsManager) {
adminCutsManager.debugOpacityState();
}
}
function forceUpdateDrawingStyle() {
if (adminCutsManager) {
adminCutsManager.forceUpdateDrawingStyle();
}
}

View File

@ -3,8 +3,8 @@
* Handles email composition, broadcasting to all users, and progress tracking * Handles email composition, broadcasting to all users, and progress tracking
*/ */
// Email state // Email state - use users module data instead of declaring our own
let allUsersData = []; // let allUsersData = []; // Removed - use window.adminUsers.getAllUsersData() instead
// Email All Users Functions // Email All Users Functions
async function showEmailUsersModal() { async function showEmailUsersModal() {
@ -14,12 +14,15 @@ async function showEmailUsersModal() {
const data = await response.json(); const data = await response.json();
if (data.success && data.users) { if (data.success && data.users) {
allUsersData = data.users; // Use the users module to store user data
if (window.adminUsers && window.adminUsers.setAllUsersData) {
window.adminUsers.setAllUsersData(data.users);
}
// Update recipients count // Update recipients count
const recipientsCount = document.getElementById('recipients-count'); const recipientsCount = document.getElementById('recipients-count');
if (recipientsCount) { if (recipientsCount) {
recipientsCount.textContent = `${allUsersData.length}`; recipientsCount.textContent = `${data.users.length}`;
} }
} }
} catch (error) { } catch (error) {
@ -144,18 +147,19 @@ async function sendEmailToAllUsers(e) {
return; return;
} }
if (allUsersData.length === 0) { const allUsers = (window.adminUsers && window.adminUsers.getAllUsersData) ? window.adminUsers.getAllUsersData() : [];
if (allUsers.length === 0) {
window.adminCore.showStatus('No users found to email', 'error'); window.adminCore.showStatus('No users found to email', 'error');
return; return;
} }
const confirmMessage = `Send this email to all ${allUsersData.length} users?`; const confirmMessage = `Send this email to all ${allUsers.length} users?`;
if (!confirm(confirmMessage)) { if (!confirm(confirmMessage)) {
return; return;
} }
// Initialize progress tracking // Initialize progress tracking
initializeEmailProgress(allUsersData.length); initializeEmailProgress(allUsers.length);
try { try {
const response = await fetch('/api/users/email-all', { const response = await fetch('/api/users/email-all', {
@ -223,7 +227,8 @@ function initializeEmailProgress(totalCount) {
if (closeBtn) closeBtn.style.display = 'none'; if (closeBtn) closeBtn.style.display = 'none';
// Add status items for each user // Add status items for each user
allUsersData.forEach(user => { const allUsers = (window.adminUsers && window.adminUsers.getAllUsersData) ? window.adminUsers.getAllUsersData() : [];
allUsers.forEach(user => {
if (statusList) { if (statusList) {
const statusItem = document.createElement('div'); const statusItem = document.createElement('div');
statusItem.className = 'email-status-item'; statusItem.className = 'email-status-item';
@ -389,6 +394,10 @@ window.adminEmail = {
updateEmailPreview, updateEmailPreview,
sendEmailToAllUsers, sendEmailToAllUsers,
setupEmailModalEventListeners, setupEmailModalEventListeners,
getAllUsersData: () => allUsersData, getAllUsersData: () => (window.adminUsers && window.adminUsers.getAllUsersData) ? window.adminUsers.getAllUsersData() : [],
setAllUsersData: (data) => { allUsersData = data; } setAllUsersData: (data) => {
if (window.adminUsers && window.adminUsers.setAllUsersData) {
window.adminUsers.setAllUsersData(data);
}
}
}; };

View File

@ -30,6 +30,12 @@ function initializeAdminMap() {
return; return;
} }
// Check if Leaflet is available
if (typeof L === 'undefined') {
console.error('Leaflet (L) is not defined. Map initialization failed.');
return;
}
console.log('Initializing admin map...'); console.log('Initializing admin map...');
adminMap = L.map('admin-map').setView([53.5461, -113.4938], 11); adminMap = L.map('admin-map').setView([53.5461, -113.4938], 11);

View File

@ -35,10 +35,18 @@ function isPointInPolygon(lat, lng, polygon) {
*/ */
function isLocationInCut(location, cutGeoJson) { function isLocationInCut(location, cutGeoJson) {
// Handle different possible field names for coordinates // Handle different possible field names for coordinates
const lat = location.latitude || location.Latitude || location.lat; const latRaw = location.latitude || location.Latitude || location.lat;
const lng = location.longitude || location.Longitude || location.lng || location.lon; const lngRaw = location.longitude || location.Longitude || location.lng || location.lon;
if (!lat || !lng || !cutGeoJson) { if (!latRaw || !lngRaw || !cutGeoJson) {
return false;
}
// Parse coordinates as floats since they might be strings
const lat = parseFloat(latRaw);
const lng = parseFloat(lngRaw);
if (isNaN(lat) || isNaN(lng)) {
return false; return false;
} }
@ -72,14 +80,20 @@ function filterLocationsInCut(locations, cut, filters = {}) {
const geojsonData = cut.geojson || cut.Geojson || cut.GeoJSON || cut['GeoJSON Data'] || cut.geojson_data; const geojsonData = cut.geojson || cut.Geojson || cut.GeoJSON || cut['GeoJSON Data'] || cut.geojson_data;
if (!geojsonData) { if (!geojsonData) {
console.log('No geojson data found for cut:', cut.name || cut.Name || 'Unknown');
return []; return [];
} }
// Debug: Log total locations being tested
console.log(`Testing ${locations.length} locations against cut boundaries`);
// First filter by geographic boundaries // First filter by geographic boundaries
let filteredLocations = locations.filter(location => let filteredLocations = locations.filter(location =>
isLocationInCut(location, geojsonData) isLocationInCut(location, geojsonData)
); );
console.log(`Filtered ${locations.length} total locations down to ${filteredLocations.length} locations within cut bounds`);
// Apply additional filters // Apply additional filters
if (filters.support_level) { if (filters.support_level) {
filteredLocations = filteredLocations.filter(location => { filteredLocations = filteredLocations.filter(location => {