From 46881f66561e69bfe9ada12c8993f23dd3e76eaf Mon Sep 17 00:00:00 2001 From: csawatzky Date: Tue, 21 Oct 2025 10:44:46 -0600 Subject: [PATCH] hotix for undefined data loads on map pages --- src/maps/MapBase.tsx | 3 +- .../mapObjectControllers/AgMapController.tsx | 174 ++++++++++-------- .../AviationMapController.tsx | 2 + .../ConstructionMapController.tsx | 2 + src/pages/Terminals.tsx | 4 +- 5 files changed, 106 insertions(+), 79 deletions(-) diff --git a/src/maps/MapBase.tsx b/src/maps/MapBase.tsx index b1dc432..fa4c9c2 100644 --- a/src/maps/MapBase.tsx +++ b/src/maps/MapBase.tsx @@ -241,7 +241,7 @@ export default function MapBase(props: Props) { homeMarkerAPI .listHomeMarkers(1, 0, undefined, undefined, undefined, undefined, as) .then(resp => { - if (resp.data.homeMarker.length < 1) { + if (!resp.data.homeMarker || resp.data.homeMarker.length < 1) { setHomePin(undefined); setHaveHome(false); setStartingView(props.currentView); @@ -271,6 +271,7 @@ export default function MapBase(props: Props) { } }) .catch(err => { + console.log(err) openSnack("Could not load Home Pin"); }); }, [as, homeMarkerAPI, openSnack, props.ignoreHomeLoad, user]); // eslint-disable-line react-hooks/exhaustive-deps diff --git a/src/maps/mapObjectControllers/AgMapController.tsx b/src/maps/mapObjectControllers/AgMapController.tsx index 7001f1a..752992d 100644 --- a/src/maps/mapObjectControllers/AgMapController.tsx +++ b/src/maps/mapObjectControllers/AgMapController.tsx @@ -221,24 +221,26 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; .then(resp => { let fields: Map = new Map(); let fieldEntries: Result[] = []; - resp.data.fields.forEach(f => { - let field = Field.any(f); - fields.set(field.key(), field); - fieldEntries.push({ - id: field.key(), - place_name: field.name(), - place_type: ["field"], - center: [field.center().longitude, field.center().latitude], - address: "", - type: "Feature", - text: field.name(), - bbox: [0,0,0,0], - geometry: {type: "Point", coordinates: [field.center().longitude, field.center().latitude]}, - context: [], - properties: {}, - relevance: 0 + if(resp.data.fields){ + resp.data.fields.forEach(f => { + let field = Field.any(f); + fields.set(field.key(), field); + fieldEntries.push({ + id: field.key(), + place_name: field.name(), + place_type: ["field"], + center: [field.center().longitude, field.center().latitude], + address: "", + type: "Feature", + text: field.name(), + bbox: [0,0,0,0], + geometry: {type: "Point", coordinates: [field.center().longitude, field.center().latitude]}, + context: [], + properties: {}, + relevance: 0 + }); }); - }); + } setFields(fields); setFieldSearchEntries(fieldEntries); }) @@ -314,53 +316,56 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; let bagOp: BagModel[] = []; let bagMarkerData: Map = new Map(); let bagEntries: Result[] = []; - resp.data.grainBags.forEach(bag => { - let b = BagModel.create(bag); - bags.set(b.key(), b); - if (bag.settings) { - if (!b.settings.startLocation?.longitude && !b.settings.endLocation?.longitude) { - bagOp.push(b); - } else { - //build the data for the marker - //TODO-CS: think about making the creation of marker data a function in the object model - let mData: MarkerData = { - title: b.name(), - longitude: b.centerLocation().longitude, - latitude: b.centerLocation().latitude, - visibleLevels: { max: 13 }, - colour: b.settings.theme?.color ?? "white", - clickFunc: (e, i, isMobile) => { - clickDelay(); - closeDrawers(); - setBagDrawer(true); - setIgnoreFeatures(true); - setObjectKey(b.key()); - moveMap( - b.centerLocation().latitude, - b.centerLocation().longitude, - zoomLevels.far, - isMobile - ); - } - }; - bagMarkerData.set(b.key(), mData); - bagEntries.push({ - center: [b.centerLocation().longitude, b.centerLocation().latitude], - id: b.key(), - place_name: b.name(), - place_type: ["grainBag"], - address: "", - bbox: [0,0,0,0], - context: [], - geometry: {type: "Point", coordinates: [b.centerLocation().longitude, b.centerLocation().latitude]}, - properties: {}, - relevance: 0, - text: "", - type: "Feature" - }); + if(resp.data.grainBags){ + + resp.data.grainBags.forEach(bag => { + let b = BagModel.create(bag); + bags.set(b.key(), b); + if (bag.settings) { + if (!b.settings.startLocation?.longitude && !b.settings.endLocation?.longitude) { + bagOp.push(b); + } else { + //build the data for the marker + //TODO-CS: think about making the creation of marker data a function in the object model + let mData: MarkerData = { + title: b.name(), + longitude: b.centerLocation().longitude, + latitude: b.centerLocation().latitude, + visibleLevels: { max: 13 }, + colour: b.settings.theme?.color ?? "white", + clickFunc: (e, i, isMobile) => { + clickDelay(); + closeDrawers(); + setBagDrawer(true); + setIgnoreFeatures(true); + setObjectKey(b.key()); + moveMap( + b.centerLocation().latitude, + b.centerLocation().longitude, + zoomLevels.far, + isMobile + ); + } + }; + bagMarkerData.set(b.key(), mData); + bagEntries.push({ + center: [b.centerLocation().longitude, b.centerLocation().latitude], + id: b.key(), + place_name: b.name(), + place_type: ["grainBag"], + address: "", + bbox: [0,0,0,0], + context: [], + geometry: {type: "Point", coordinates: [b.centerLocation().longitude, b.centerLocation().latitude]}, + properties: {}, + relevance: 0, + text: "", + type: "Feature" + }); + } } - } - }); + }); + } setBagOptions(bagOp); setGrainBags(bags); grainBagsRef.current = bags; @@ -382,19 +387,21 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; binYardAPI .listBinYards(400, 0, "asc", undefined, undefined, undefined, as) .then(resp => { - resp.data.yard.forEach(yard => { - if (yard.settings) { - yardMap.set(yard.settings.key, yard.settings); - if ( - (!yard.settings.latitude && !yard.settings.longitude) || - (yard.settings.latitude === 0 && yard.settings.longitude === 0) - ) { - yardOps.push(yard.settings); - } else { - let mData: MarkerData = { - title: yard.settings.name, - longitude: yard.settings.longitude, - latitude: yard.settings.latitude, + if(resp.data.yard){ + + resp.data.yard.forEach(yard => { + if (yard.settings) { + yardMap.set(yard.settings.key, yard.settings); + if ( + (!yard.settings.latitude && !yard.settings.longitude) || + (yard.settings.latitude === 0 && yard.settings.longitude === 0) + ) { + yardOps.push(yard.settings); + } else { + let mData: MarkerData = { + title: yard.settings.name, + longitude: yard.settings.longitude, + latitude: yard.settings.latitude, colour: yard.settings.theme?.color ?? "green", markerIcon: , visibleLevels: { max: 17 }, @@ -429,6 +436,7 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; } } }); + } setYardMarkerData(newYardMarkers); setYardSearchEntries(yardEntries); setBinYards(yardMap); @@ -447,6 +455,9 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; let markerData: Map = new Map(); let searchEntries: Result[] = []; let binOp: IBin[] = []; + if(resp.data.bins){ + + resp.data.bins.forEach(bin => { let b = IBin.create(bin); binMap.set(b.key(), b); @@ -495,6 +506,7 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; } } }); + } setBinMarkerData(markerData); setBinSearchEntries(searchEntries); setBins(binMap); @@ -514,6 +526,9 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; let searchEntries: Result[] = []; let options: DeviceModel[] = []; + if(resp.data.devices){ + + resp.data.devices.forEach((device, i) => { //add device to the main map let d = DeviceModel.any(device); @@ -553,6 +568,7 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; } } }); + } setDevices(map); setDeviceOptions(options); setDeviceMarkerData(newDevMarkers); @@ -725,6 +741,9 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; let fmMap: Map = new Map(); let markerData: Map = new Map(); let searchEntries: Result[] = []; + if(resp.data.fieldMarker){ + + resp.data.fieldMarker.forEach(fieldMarker => { let fm = FieldMarker.create(fieldMarker); fmMap.set(fm.key(), fm); @@ -750,7 +769,7 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; }); setAnchorFieldMarker(event.currentTarget); setFMIndexKey(index); - setObjectKey(fm.key()); + setObjectKey(fm.key()); } }); searchEntries.push({ @@ -760,6 +779,7 @@ import { Result } from "@mapbox/mapbox-gl-geocoder"; place_type: ["fieldMarker"] } as Result); }); + } setFieldMarkers(fmMap); setFieldMarkerData(markerData); setFieldMarkerSearchEntries(searchEntries); diff --git a/src/maps/mapObjectControllers/AviationMapController.tsx b/src/maps/mapObjectControllers/AviationMapController.tsx index 0e13ed4..795da0d 100644 --- a/src/maps/mapObjectControllers/AviationMapController.tsx +++ b/src/maps/mapObjectControllers/AviationMapController.tsx @@ -175,6 +175,7 @@ export default function AviationMapController(props: Props) { let terminalMarkers: Map = new Map(); let terminalOps: Terminal[] = []; let searchEntries: Result[] = []; + if(resp.data.terminals){ resp.data.terminals.forEach(term => { let terminal = Terminal.create(term); terminalMap.set(terminal.key, terminal); @@ -207,6 +208,7 @@ export default function AviationMapController(props: Props) { terminalOps.push(terminal); } }); + } setTerminals(terminalMap); setTerminalMarkers(terminalMarkers); setTerminalSearchEntries(searchEntries); diff --git a/src/maps/mapObjectControllers/ConstructionMapController.tsx b/src/maps/mapObjectControllers/ConstructionMapController.tsx index 54aa166..ded56d6 100644 --- a/src/maps/mapObjectControllers/ConstructionMapController.tsx +++ b/src/maps/mapObjectControllers/ConstructionMapController.tsx @@ -142,6 +142,7 @@ export default function ConstructionMapController(props: Props) { siteAPI .listSitesPageData(50, 0, "asc", "key", undefined, as) .then(resp => { + if(resp.data.sites){ resp.data.sites.forEach(site => { if (!site) return; let newSite: Site = Site.any(site.site); @@ -179,6 +180,7 @@ export default function ConstructionMapController(props: Props) { place_type: ["site"] } as Result); }); + } setSiteMarkerData(sm); setSites(s); setLoadingSites(false); diff --git a/src/pages/Terminals.tsx b/src/pages/Terminals.tsx index 51aa2a7..916116c 100644 --- a/src/pages/Terminals.tsx +++ b/src/pages/Terminals.tsx @@ -182,7 +182,9 @@ export default function Terminals(props: Props) { if(loading) return setLoading(true) terminalAPI.listTerminals(200, 0, "asc", "name", as).then(resp => { - setTerminals(resp.data.terminals.map(a => Terminal.any(a))); + if(resp.data.terminals){ + setTerminals(resp.data.terminals.map(a => Terminal.any(a))); + } }).catch(err => { console.log("There was a problem loading Terminals") }).finally(() => {