Skip to content

Commit 1a5fbb5

Browse files
authored
Merge pull request #115 from tristanbudd/remove-poi
Remove poi
2 parents e16b468 + 5e58c1e commit 1a5fbb5

10 files changed

Lines changed: 20 additions & 185 deletions

File tree

app/Http/Controllers/Api/VesselController.php

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -781,34 +781,4 @@ public function infractionsList(Request $request): JsonResponse
781781
],
782782
]);
783783
}
784-
785-
/**
786-
* List Ports of Interest
787-
*
788-
* Retrieve the list of high-risk maritime hubs and ports being monitored by SIST.
789-
*
790-
* @response 200 scenario="Success" {
791-
* "data": [
792-
* {
793-
* "name": "CPC Marine Terminal",
794-
* "lat": 44.6300,
795-
* "lng": 37.6400,
796-
* "severity": "high",
797-
* "type": "Major export hub",
798-
* "source": "FleetLeaks"
799-
* }
800-
* ]
801-
* }
802-
*/
803-
public function portsOfInterest(): JsonResponse
804-
{
805-
$path = resource_path('data/ports_of_interest.json');
806-
if (! file_exists($path)) {
807-
return response()->json(['data' => []]);
808-
}
809-
810-
$zones = json_decode(file_get_contents($path), true);
811-
812-
return response()->json(['data' => $zones]);
813-
}
814784
}

docker/entrypoint/start.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ if [ "${RUN_DEPLOY_TASKS_ON_STARTUP:-true}" = "true" ]; then
2828
php artisan route:cache
2929
php artisan view:cache
3030
php artisan scribe:generate
31-
php artisan sist:rebuild-analysis
3231
fi
3332

3433
exec "$@"

resources/js/Components/AnalysisReportModal.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,9 @@ export default function AnalysisReportModal({
748748
<div className="space-y-1">
749749
<DataRow
750750
label="Vessel Name"
751-
value={details?.name || vessel.name}
751+
value={
752+
details?.name || vessel.name || 'UNKNOWN VESSEL'
753+
}
752754
/>
753755
<DataRow label="MMSI Number" value={vessel.mmsi} />
754756
<DataRow
@@ -1788,7 +1790,7 @@ export default function AnalysisReportModal({
17881790
Risk Score
17891791
</span>
17901792
<div className="text-4xl font-black text-white">
1791-
{activityStats.score}%
1793+
{Math.floor(activityStats.score)}
17921794
</div>
17931795
<div className="text-[9px] text-zinc-600 uppercase font-bold tracking-tight">
17941796
Profile Analysis

resources/js/Components/InfractionsPanel.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default function InfractionsPanel({
4747
const closePanel = onClose ?? (() => setIsOpenInternal(false));
4848

4949
const [searchQuery, setSearchQuery] = useState('');
50-
const [severityFilter, setSeverityFilter] = useState<'low' | 'medium' | 'high'>('high');
50+
const [severityFilter, setSeverityFilter] = useState<'all' | 'low' | 'medium' | 'high'>('all');
5151
const [statusFilter, setStatusFilter] = useState<'all' | 'online' | 'offline'>('all');
5252
const [vessels, setVessels] = useState<InfractionVessel[]>([]);
5353
const [loading, setLoading] = useState(true);
@@ -220,8 +220,14 @@ export default function InfractionsPanel({
220220

221221
<div className="flex flex-col gap-2">
222222
<div className="flex bg-zinc-950 border border-white/20 divide-x divide-white/10 overflow-hidden w-full">
223-
{(['low', 'medium', 'high'] as const).map((sev) => {
224-
const meta = getRiskMetadata(sev);
223+
{(['all', 'low', 'medium', 'high'] as const).map((sev) => {
224+
const isAll = sev === 'all';
225+
const meta = isAll ? null : getRiskMetadata(sev);
226+
const colorClass = isAll ? 'text-white' : meta!.colorClass;
227+
const bgClass = isAll
228+
? 'bg-white'
229+
: meta!.colorClass.replace('text-', 'bg-');
230+
225231
return (
226232
<button
227233
key={sev}
@@ -235,14 +241,14 @@ export default function InfractionsPanel({
235241
}}
236242
className={`flex-1 text-[9px] font-bold uppercase tracking-widest px-2 py-3 transition-all relative ${
237243
severityFilter === sev
238-
? meta.colorClass
244+
? colorClass
239245
: 'bg-transparent text-zinc-500 hover:bg-white/5 hover:text-zinc-300'
240246
}`}
241247
>
242248
{sev}
243249
{severityFilter === sev && (
244250
<div
245-
className={`absolute bottom-0 left-0 right-0 h-0.5 ${meta.colorClass.replace('text-', 'bg-')}`}
251+
className={`absolute bottom-0 left-0 right-0 h-0.5 ${bgClass}`}
246252
/>
247253
)}
248254
</button>
@@ -310,7 +316,7 @@ export default function InfractionsPanel({
310316
<div className="flex-1 min-w-0">
311317
<div className="flex items-center gap-2 mb-1">
312318
<span className="text-xs font-bold text-white truncate">
313-
{vessel.name}
319+
{vessel.name?.trim() || 'UNKNOWN VESSEL'}
314320
</span>
315321
{isOnline ? (
316322
<span className="text-[8px] bg-emerald-500/10 text-emerald-500 px-1.5 py-0.5 whitespace-nowrap font-semibold tracking-wider border border-emerald-500/20">
@@ -360,7 +366,7 @@ export default function InfractionsPanel({
360366
).colorClass
361367
}
362368
>
363-
{vessel.risk_score}
369+
{Math.floor(vessel.risk_score)}
364370
</span>
365371
</div>
366372
</div>

resources/js/Components/LayerControl.tsx

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ interface LayerControlProps {
77
setShowPorts: (v: boolean) => void;
88
showCities: boolean;
99
setShowCities: (v: boolean) => void;
10-
showPois: boolean;
11-
setShowPois: (v: boolean) => void;
1210
isOpen: boolean;
1311
onClose: () => void;
1412
}
@@ -20,8 +18,6 @@ export default function LayerControl({
2018
setShowPorts,
2119
showCities,
2220
setShowCities,
23-
showPois,
24-
setShowPois,
2521
isOpen,
2622
onClose,
2723
}: LayerControlProps) {
@@ -99,24 +95,6 @@ export default function LayerControl({
9995
/>
10096
</div>
10197
</button>
102-
103-
<button
104-
onClick={() => setShowPois(!showPois)}
105-
className="flex items-center justify-between group cursor-pointer"
106-
>
107-
<span
108-
className={`text-[11px] font-bold uppercase tracking-wider transition-colors ${showPois ? 'text-white' : 'text-zinc-600'}`}
109-
>
110-
Ports of Interest
111-
</span>
112-
<div
113-
className={`w-8 h-4 border transition-colors relative ${showPois ? 'bg-white border-white' : 'border-zinc-800 bg-transparent'}`}
114-
>
115-
<div
116-
className={`absolute top-0.5 bottom-0.5 w-3 transition-all ${showPois ? 'right-0.5 bg-black' : 'left-0.5 bg-zinc-800'}`}
117-
/>
118-
</div>
119-
</button>
12098
</div>
12199
</div>
122100

@@ -158,14 +136,6 @@ export default function LayerControl({
158136
City / Town
159137
</span>
160138
</div>
161-
<div className="flex items-center gap-3">
162-
<div className="w-5 h-5 bg-zinc-900 border border-white/10 flex items-center justify-center">
163-
<div className="w-2.5 h-2.5 rounded-full border border-red-500 shadow-[0_0_8px_rgba(239,68,68,0.4)]" />
164-
</div>
165-
<span className="text-[9px] font-bold text-zinc-400 uppercase tracking-tight">
166-
Port of Interest (POI)
167-
</span>
168-
</div>
169139
</div>
170140
</div>
171141
</div>

resources/js/Components/MapDisplay.tsx

Lines changed: 0 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -908,103 +908,6 @@ function CityLayer() {
908908
);
909909
}
910910

911-
interface PortOfInterest {
912-
name: string;
913-
lat: number;
914-
lng: number;
915-
severity: 'low' | 'medium' | 'high';
916-
type: string;
917-
}
918-
919-
function PortOfInterestLayer() {
920-
const [zones, setZones] = useState<PortOfInterest[]>([]);
921-
922-
useEffect(() => {
923-
axios.get(`${API_BASE_URL}/vessels/ports-of-interest`).then((res) => {
924-
setZones(res.data.data || []);
925-
});
926-
}, []);
927-
928-
return (
929-
<>
930-
{zones.map((zone, idx) => (
931-
<div key={`${zone.name}-${idx}`}>
932-
<CircleMarker
933-
center={[zone.lat, zone.lng]}
934-
radius={8}
935-
pathOptions={{
936-
color:
937-
zone.severity === 'high'
938-
? '#ef4444'
939-
: zone.severity === 'medium'
940-
? '#f59e0b'
941-
: '#10b981',
942-
fillColor:
943-
zone.severity === 'high'
944-
? '#ef4444'
945-
: zone.severity === 'medium'
946-
? '#f59e0b'
947-
: '#10b981',
948-
fillOpacity: 0.1,
949-
weight: 1,
950-
}}
951-
/>
952-
<Marker
953-
position={[zone.lat, zone.lng]}
954-
icon={L.divIcon({
955-
className: 'poi-icon',
956-
html: renderToString(
957-
<div className="relative flex items-center justify-center">
958-
<div
959-
className={`w-2 h-2 rounded-full border border-white/50 ${zone.severity === 'high' ? 'bg-red-500 shadow-[0_0_10px_#ef4444]' : zone.severity === 'medium' ? 'bg-amber-500 shadow-[0_0_10px_#f59e0b]' : 'bg-emerald-500 shadow-[0_0_10px_#10b981]'}`}
960-
/>
961-
</div>
962-
),
963-
iconSize: [20, 20],
964-
iconAnchor: [10, 10],
965-
})}
966-
>
967-
<Popup closeButton={false}>
968-
<div className="bg-zinc-950 border border-white/20 p-4 min-w-50 shadow-2xl">
969-
<div className="flex flex-col gap-1 border-b border-white/10 pb-2 mb-2">
970-
<span
971-
className={`text-[10px] font-black uppercase tracking-[0.2em] ${zone.severity === 'high' ? 'text-red-500' : zone.severity === 'medium' ? 'text-amber-500' : 'text-emerald-500'}`}
972-
>
973-
Port of Interest
974-
</span>
975-
<span className="text-xs font-bold text-white uppercase tracking-wider">
976-
{zone.name}
977-
</span>
978-
</div>
979-
<div className="flex flex-col gap-2">
980-
<div className="flex flex-col gap-0.5">
981-
<span className="text-[8px] text-zinc-600 uppercase font-black">
982-
Classification
983-
</span>
984-
<span className="text-[10px] font-bold text-zinc-300">
985-
{zone.type}
986-
</span>
987-
</div>
988-
<div className="flex flex-col gap-0.5">
989-
<span className="text-[8px] text-zinc-600 uppercase font-black">
990-
Threat Level
991-
</span>
992-
<span
993-
className={`text-[10px] font-bold uppercase ${zone.severity === 'high' ? 'text-red-500' : zone.severity === 'medium' ? 'text-amber-500' : 'text-emerald-500'}`}
994-
>
995-
{zone.severity} Severity
996-
</span>
997-
</div>
998-
</div>
999-
</div>
1000-
</Popup>
1001-
</Marker>
1002-
</div>
1003-
))}
1004-
</>
1005-
);
1006-
}
1007-
1008911
function ZoomControls() {
1009912
const map = useMap();
1010913

@@ -1077,8 +980,6 @@ interface MapDisplayProps {
1077980
setShowPorts: (v: boolean) => void;
1078981
showCities: boolean;
1079982
setShowCities: (v: boolean) => void;
1080-
showPois: boolean;
1081-
setShowPois: (v: boolean) => void;
1082983
}
1083984

1084985
export default function MapDisplay({
@@ -1110,8 +1011,6 @@ export default function MapDisplay({
11101011
setShowPorts,
11111012
showCities,
11121013
setShowCities,
1113-
showPois,
1114-
setShowPois,
11151014
}: MapDisplayProps) {
11161015
const [isCompact, setIsCompact] = useState(
11171016
typeof window !== 'undefined' ? window.innerWidth < 640 || window.innerHeight < 840 : false
@@ -1146,7 +1045,6 @@ export default function MapDisplay({
11461045

11471046
{showPorts && <PortLayer />}
11481047
{showCities && <CityLayer />}
1149-
{showPois && <PortOfInterestLayer />}
11501048
<FleetLayer
11511049
onUpdate={onFleetUpdate}
11521050
selectedMmsi={selectedMmsi}
@@ -1182,8 +1080,6 @@ export default function MapDisplay({
11821080
setShowPorts={setShowPorts}
11831081
showCities={showCities}
11841082
setShowCities={setShowCities}
1185-
showPois={showPois}
1186-
setShowPois={setShowPois}
11871083
isOpen={isLayersOpen}
11881084
onClose={() => onLayersOpenChange(false)}
11891085
/>

resources/js/Components/SanctionedShipsPanel.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,6 @@ interface SanctionedShipsPanelWithToolsProps {
7373
setShowPorts?: (v: boolean) => void;
7474
showCities?: boolean;
7575
setShowCities?: (v: boolean) => void;
76-
showPois?: boolean;
77-
setShowPois?: (v: boolean) => void;
7876
isSearchActive?: boolean;
7977
trackedVessels?: MapVessel[];
8078
}
@@ -447,7 +445,7 @@ export default function SanctionedShipsPanel({
447445
<div className="flex-1 min-w-0">
448446
<div className="flex items-center gap-2 mb-1">
449447
<span className="text-xs font-bold text-white truncate">
450-
{vessel.name}
448+
{vessel.name?.trim() || 'UNKNOWN VESSEL'}
451449
</span>
452450
{offline ? (
453451
<span className="text-[8px] bg-zinc-800 text-zinc-400 px-1.5 py-0.5 whitespace-nowrap font-semibold tracking-wider">

resources/js/Components/ShipDetailsSidebar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ export default function ShipDetailsSidebar({
554554
id="vessel-details-title"
555555
className="text-2xl font-black text-white tracking-tight uppercase leading-tight"
556556
>
557-
{details?.name || vessel.name || 'Unknown Vessel'}
557+
{details?.name || vessel.name || 'UNKNOWN VESSEL'}
558558
</h2>
559559
<div className="flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-3 mt-2 text-[11px] text-zinc-400 font-mono">
560560
<span>MMSI: {vessel.mmsi}</span>
@@ -869,7 +869,7 @@ export default function ShipDetailsSidebar({
869869
getRiskMetadata(activityStats.riskLevel).colorClass
870870
}`}
871871
>
872-
{activityStats.score}
872+
{Math.floor(activityStats.score)}
873873
</div>
874874
)}
875875
<div className="min-w-0">

resources/js/Pages/Index.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ export default function Index() {
147147
const [showVessels, setShowVessels] = useState(true);
148148
const [showPorts, setShowPorts] = useState(false);
149149
const [showCities, setShowCities] = useState(false);
150-
const [showPois, setShowPois] = useState(true);
151150
const [isSearchActive, setIsSearchActive] = useState(false);
152151

153152
return (
@@ -227,8 +226,6 @@ export default function Index() {
227226
setShowPorts={setShowPorts}
228227
showCities={showCities}
229228
setShowCities={setShowCities}
230-
showPois={showPois}
231-
setShowPois={setShowPois}
232229
/>
233230
<ShipDetailsSidebar
234231
vessel={selectedVessel}
@@ -269,8 +266,6 @@ export default function Index() {
269266
setShowPorts={setShowPorts}
270267
showCities={showCities}
271268
setShowCities={setShowCities}
272-
showPois={showPois}
273-
setShowPois={setShowPois}
274269
isSearchActive={isSearchActive}
275270
trackedVessels={trackedVessels}
276271
/>

routes/web.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
Route::get('/{mmsi}/history', [VesselController::class, 'history'])->name('history');
3838
Route::get('/{mmsi}/sanctions', [VesselController::class, 'checkSanctions'])->name('sanctions');
3939
Route::get('/{mmsi}/activities', [VesselController::class, 'activities'])->name('activities');
40-
Route::get('/ports-of-interest', [VesselController::class, 'portsOfInterest'])->name('ports-of-interest');
4140
});
4241
});
4342
});

0 commit comments

Comments
 (0)