From 5d13ff532bd1cfc02d152baf2c3b10743e705cca Mon Sep 17 00:00:00 2001 From: vergiLgood1 Date: Sun, 4 May 2025 05:18:12 +0700 Subject: [PATCH] refactor: rename TopNavigation to TopControl and update related imports in CrimeMap style: update MapLegend text color for better visibility --- .../map/controls/layer-control.tsx | 126 ------------------ .../_components/map/controls/map-legend.tsx | 2 +- .../map/controls/map-navigations.tsx | 8 +- .../app/_components/map/crime-map.tsx | 5 +- 4 files changed, 8 insertions(+), 133 deletions(-) delete mode 100644 sigap-website/app/_components/map/controls/layer-control.tsx diff --git a/sigap-website/app/_components/map/controls/layer-control.tsx b/sigap-website/app/_components/map/controls/layer-control.tsx deleted file mode 100644 index 30cf685..0000000 --- a/sigap-website/app/_components/map/controls/layer-control.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import { Checkbox } from "../../ui/checkbox"; -import { Label } from "../../ui/label"; -import { RadioGroup, RadioGroupItem } from "../../ui/radio-group"; -import { ControlPosition, IControl, Map } from "mapbox-gl" -import { useControl } from "react-map-gl/mapbox" -import React, { useEffect } from "react" -import { createRoot } from "react-dom/client" - -interface MapLayerControlProps { - position?: ControlPosition - isFullscreen?: boolean -} - -// React component for layer control content -const LayerControlContent = () => { - return ( -
-
Lapisan peta
- -
- - -
- -
- - -
- -
-
Waktu
- -
- - -
-
- - -
-
-
-
- ) -} - -class LayerControlMapboxControl implements IControl { - private container: HTMLElement; - private map?: Map; - private props: MapLayerControlProps; - private root: ReturnType | null = null; - private isUnmounting: boolean = false; - - constructor(props: MapLayerControlProps) { - this.props = props; - this.container = document.createElement("div"); - this.container.className = "mapboxgl-ctrl"; - } - - onAdd(map: Map): HTMLElement { - this.map = map; - this.container.className = 'mapboxgl-ctrl mapboxgl-ctrl-layer absolute bottom-36 left-0 z-20 bg-black/70 text-white p-3 rounded-tr-lg'; - this.render(); - return this.container; - } - - onRemove(): void { - if (this.isUnmounting) return; - - this.isUnmounting = true; - requestAnimationFrame(() => { - if (this.root) { - this.root.unmount(); - this.root = null; - } - if (this.container.parentNode) { - this.container.parentNode.removeChild(this.container); - } - this.map = undefined; - this.isUnmounting = false; - }); - } - - updateProps(props: MapLayerControlProps): void { - this.props = props; - this.render(); - } - - render(): void { - if (this.props.isFullscreen === false) { - if (this.container.style.display !== 'none') { - this.container.style.display = 'none'; - } - return; - } else { - this.container.style.display = 'block'; - } - - if (!this.root) { - this.root = createRoot(this.container); - } - - this.root.render(); - } -} - -export function MapLayerControl({ position = 'bottom-left', isFullscreen }: MapLayerControlProps) { - const control = useControl( - () => new LayerControlMapboxControl({ position, isFullscreen }), - { position } - ); - - useEffect(() => { - control.updateProps({ position, isFullscreen }); - }, [control, position, isFullscreen]); - - return null; -} diff --git a/sigap-website/app/_components/map/controls/map-legend.tsx b/sigap-website/app/_components/map/controls/map-legend.tsx index 003f3fc..07009a8 100644 --- a/sigap-website/app/_components/map/controls/map-legend.tsx +++ b/sigap-website/app/_components/map/controls/map-legend.tsx @@ -9,7 +9,7 @@ interface MapLegendProps { export default function MapLegend({ position = "bottom-right" }: MapLegendProps) { return ( // -
+
Low
diff --git a/sigap-website/app/_components/map/controls/map-navigations.tsx b/sigap-website/app/_components/map/controls/map-navigations.tsx index b674ee2..cce4a10 100644 --- a/sigap-website/app/_components/map/controls/map-navigations.tsx +++ b/sigap-website/app/_components/map/controls/map-navigations.tsx @@ -28,7 +28,7 @@ import { } from "lucide-react" import { ITopTooltipsMapId } from "./map-tooltips" -interface TopNavigationProps { +interface TopControlProps { onControlChange?: (controlId: ITopTooltipsMapId) => void activeControl?: string selectedYear: number @@ -41,7 +41,7 @@ interface TopNavigationProps { categories?: string[] } -export default function TopNavigation({ +export default function TopControl({ onControlChange, activeControl, selectedYear, @@ -52,7 +52,7 @@ export default function TopNavigation({ setSelectedCategory, availableYears = [2022, 2023, 2024], categories = [], -}: TopNavigationProps) { +}: TopControlProps) { const [showSelectors, setShowSelectors] = useState(false) const containerRef = useRef(null) @@ -71,7 +71,7 @@ export default function TopNavigation({ { id: "heatmap" as ITopTooltipsMapId, icon: , label: "Crime Heatmap" }, { id: "trends" as ITopTooltipsMapId, icon: , label: "Crime Trends" }, { id: "patrol" as ITopTooltipsMapId, icon: , label: "Patrol Areas" }, - { id: "clusters" as ITopTooltipsMapId, icon: , label: "Offender Clusters" }, + { id: "clusters" as ITopTooltipsMapId, icon: , label: "Clusters" }, { id: "timeline" as ITopTooltipsMapId, icon: , label: "Time Analysis" }, ] diff --git a/sigap-website/app/_components/map/crime-map.tsx b/sigap-website/app/_components/map/crime-map.tsx index 945874f..af53241 100644 --- a/sigap-website/app/_components/map/crime-map.tsx +++ b/sigap-website/app/_components/map/crime-map.tsx @@ -14,13 +14,14 @@ import MapLegend from "./controls/map-legend" import { useGetAvailableYears, useGetCrimeCategories, useGetCrimes } from "@/app/(pages)/(admin)/dashboard/crime-management/crime-overview/_queries/queries" import { ITopTooltipsMapId } from "./controls/map-tooltips" import MapSelectors from "./controls/map-selector" -import TopNavigation from "./controls/map-navigations" + import CrimeSidebar from "./sidebar/map-sidebar" import SidebarToggle from "./sidebar/sidebar-toggle" import { cn } from "@/app/_lib/utils" import CrimePopup from "./pop-up/crime-popup" import { $Enums, crime_categories, crime_incidents, crimes, demographics, districts, geographics, locations } from "@prisma/client" import { CrimeTimelapse } from "./controls/crime-timelapse" +import TopControl from "./controls/map-navigations" // Updated CrimeIncident type to match the structure in crime_incidents interface CrimeIncident { @@ -281,7 +282,7 @@ export default function CrimeMap() { <>
-