diff --git a/src/app/(frontend)/intelligence/missions/[id]/page.tsx b/src/app/(frontend)/intelligence/missions/[id]/page.tsx index 81b1342..af1704c 100644 --- a/src/app/(frontend)/intelligence/missions/[id]/page.tsx +++ b/src/app/(frontend)/intelligence/missions/[id]/page.tsx @@ -41,6 +41,8 @@ import { getUserAttendance, isMissionPast, } from "@/lib/attendance"; +import { MissionPlanningMap } from "@/components/frontend/intelligence/missionMap/MissionPlanningMap"; +import { listMissionMarkers } from "@/lib/intelligence/missionMap"; interface MissionDetailPageProps { params: Promise<{ id: string }>; @@ -114,7 +116,7 @@ export default async function MissionDetailPage({ params }: MissionDetailPagePro mission.createdBy !== null ? (mission.createdBy as User) : null; - const hostLabel = host ? (host.displayName || host.username) : null; + const hostLabel = host ? host.displayName || host.username : null; const durationHours = Math.floor(mission.classification.estimatedDuration / 60); const durationMins = mission.classification.estimatedDuration % 60; @@ -197,13 +199,11 @@ export default async function MissionDetailPage({ params }: MissionDetailPagePro sideOpCampaigns = campaignsRes.docs.map((c) => ({ id: c.id, name: c.name })); sideOpModLists = modListsRes.docs.map((l) => ({ id: l.id, name: l.modlistName })); const currentCampaignId = - typeof mission.classification.campaign === "object" && mission.classification.campaign !== null + typeof mission.classification.campaign === "object" && + mission.classification.campaign !== null ? mission.classification.campaign.id : mission.classification.campaign; - if ( - currentCampaignId != null && - !sideOpCampaigns.some((c) => c.id === currentCampaignId) - ) { + if (currentCampaignId != null && !sideOpCampaigns.some((c) => c.id === currentCampaignId)) { sideOpCampaigns = [ ...sideOpCampaigns, { @@ -261,6 +261,14 @@ export default async function MissionDetailPage({ params }: MissionDetailPagePro /> ); + // Planning map: visible to everyone who can see the mission once enabled; + // editors (missions:update or the creator) also get the opt-in control. + const canEditPlan = canControlSideOp; + const planningMapEnabled = mission.classification.planningMapEnabled === true; + const planMarkers = + map && planningMapEnabled ? await listMissionMarkers(payload, mission.id) : []; + const showPlanningMap = map !== null && (planningMapEnabled || canEditPlan); + const providedRoles = mission.missionRoles?.providedRoles ?? []; const signupGate = roleSignupGate(mission); const signupState = await getMissionRoleSignupState(payload, mission.id, currentUser?.id ?? null); @@ -413,6 +421,21 @@ export default async function MissionDetailPage({ params }: MissionDetailPagePro
{toolInfo.hint}
++ Pick a placement tool, or select a marker on the map to edit it. +
+ )} + + {isIcon && ( ++ Lines take the color, text and opacity above. +
+ )} +No markers match.
+ )} + {filtered.map((group) => ( +Planning map
++ Show {map.name} on this page and plan the operation with Arma 3 map markers. Markers + only appear on this mission. +
+