From 0e414850bdf69c4c5e76003f9e4228ac4ba3369c Mon Sep 17 00:00:00 2001 From: Davide Passoni Date: Thu, 13 Jun 2024 16:26:12 +0200 Subject: [PATCH] All map layers and mirrors moved to config (THANKS WIRTS) --- frontend/server/views/toolbars/primary.ejs | 2 +- frontend/website/src/constants/constants.ts | 20 +------ frontend/website/src/map/map.ts | 60 ++++++++++++++------- 3 files changed, 45 insertions(+), 37 deletions(-) diff --git a/frontend/server/views/toolbars/primary.ejs b/frontend/server/views/toolbars/primary.ejs index 30977e03..268d3d27 100644 --- a/frontend/server/views/toolbars/primary.ejs +++ b/frontend/server/views/toolbars/primary.ejs @@ -33,7 +33,7 @@
DCS Map mirror 1
+ class="ol-select-value-text">
diff --git a/frontend/website/src/constants/constants.ts b/frontend/website/src/constants/constants.ts index 3ed1d97d..d845cbe9 100644 --- a/frontend/website/src/constants/constants.ts +++ b/frontend/website/src/constants/constants.ts @@ -162,25 +162,9 @@ export const mapBounds = { "Kola": { bounds: new LatLngBounds([61.59999, 4.29982], [75.05179, 44.29982]), zoom: 3} } -export const mapMirrors = { - "DCS Map mirror 1": "https://maps.dcsolympus.com/maps", - "DCS Map mirror 2": "https://refugees.dcsolympus.com/maps" -} +export const defaultMapMirrors = {} -export const defaultMapLayers = { - "ArcGIS Satellite": { - urlTemplate: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", - minZoom: 1, - maxZoom: 19, - attribution: "Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Mapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community" - }, - "OpenStreetMap Mapnik": { - urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - minZoom: 1, - maxZoom: 20, - attribution: '© OpenStreetMap contributors' - } -} +export const defaultMapLayers = {} /* Map constants */ export const IDLE = "Idle"; diff --git a/frontend/website/src/map/map.ts b/frontend/website/src/map/map.ts index 5a841b1d..79bbcecf 100644 --- a/frontend/website/src/map/map.ts +++ b/frontend/website/src/map/map.ts @@ -12,7 +12,7 @@ import { DestinationPreviewMarker } from "./markers/destinationpreviewmarker"; import { TemporaryUnitMarker } from "./markers/temporaryunitmarker"; import { ClickableMiniMap } from "./clickableminimap"; import { SVGInjector } from '@tanem/svg-injector' -import { defaultMapLayers, mapBounds, minimapBoundaries, IDLE, COALITIONAREA_DRAW_POLYGON, MOVE_UNIT, SHOW_UNIT_CONTACTS, HIDE_GROUP_MEMBERS, SHOW_UNIT_PATHS, SHOW_UNIT_TARGETS, SHOW_UNIT_LABELS, SHOW_UNITS_ENGAGEMENT_RINGS, SHOW_UNITS_ACQUISITION_RINGS, HIDE_UNITS_SHORT_RANGE_RINGS, FILL_SELECTED_RING, MAP_MARKER_CONTROLS, DCS_LINK_PORT, DCS_LINK_RATIO, mapMirrors } from "../constants/constants"; +import { defaultMapLayers, mapBounds, minimapBoundaries, IDLE, COALITIONAREA_DRAW_POLYGON, MOVE_UNIT, SHOW_UNIT_CONTACTS, HIDE_GROUP_MEMBERS, SHOW_UNIT_PATHS, SHOW_UNIT_TARGETS, SHOW_UNIT_LABELS, SHOW_UNITS_ENGAGEMENT_RINGS, SHOW_UNITS_ACQUISITION_RINGS, HIDE_UNITS_SHORT_RANGE_RINGS, FILL_SELECTED_RING, MAP_MARKER_CONTROLS, DCS_LINK_PORT, DCS_LINK_RATIO, defaultMapMirrors } from "../constants/constants"; import { CoalitionArea } from "./coalitionarea/coalitionarea"; import { CoalitionAreaContextMenu } from "../contextmenus/coalitionareacontextmenu"; import { DrawingCursor } from "./coalitionarea/drawingcursor"; @@ -97,6 +97,7 @@ export class Map extends L.Map { #mapSourceDropdown: Dropdown; #mapLayers: any = defaultMapLayers; + #mapMirrors: any = defaultMapMirrors; #mapMarkerVisibilityControls: MapMarkerVisibilityControl[] = MAP_MARKER_CONTROLS; #mapVisibilityOptionsDropdown: Dropdown; #optionButtons: { [key: string]: HTMLButtonElement[] } = {} @@ -131,10 +132,8 @@ export class Map extends L.Map { this.#ID = ID; - this.setLayer("DCS Map mirror 1"); - /* Minimap */ - var minimapLayer = new L.TileLayer(this.#mapLayers[Object.keys(this.#mapLayers)[0]].urlTemplate, { minZoom: 0, maxZoom: 13 }); + var minimapLayer = new L.TileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", { minZoom: 0, maxZoom: 13 }); this.#miniMapLayerGroup = new L.LayerGroup([minimapLayer]); this.#miniMapPolyline = new L.Polyline([], { color: '#202831' }); this.#miniMapPolyline.addTo(this.#miniMapLayerGroup); @@ -226,13 +225,40 @@ export class Map extends L.Map { document.addEventListener("configLoaded", () => { let config = getApp().getConfig(); - if (config.additionalMaps) { - let additionalMaps = config.additionalMaps; + let layerSet = false; + + /* First load the map mirrors */ + if (config.mapMirrors) { + let mapMirrors = config.mapMirrors; + this.#mapMirrors = { + ...this.#mapMirrors, + ...mapMirrors + } + this.setLayer(Object.keys(mapMirrors)[0]); + } + + /* Set the options, and if at least one mirror is available, select the first */ + this.#mapSourceDropdown.setOptions(Object.keys(this.#mapMirrors), null); + if (Object.keys(this.#mapMirrors).length > 0) { + this.#mapSourceDropdown.selectValue(0); + this.setLayer(Object.keys(this.#mapMirrors)[0]); + layerSet = true; // Needed because this is async + } + + /* Then load the map layers */ + if (config.mapLayers) { + let mapLayers = config.mapLayers; this.#mapLayers = { ...this.#mapLayers, - ...additionalMaps + ...mapLayers } - this.#mapSourceDropdown.setOptions(this.getLayers(), null); + } + + /* Append this options, and if no mirror was selected, select the first on (if available). Mirrors have the precedence */ + this.#mapSourceDropdown.setOptions(Object.keys(this.#mapMirrors).concat(Object.keys(this.#mapLayers)), null); + if (!layerSet && Object.keys(this.#mapLayers).length > 0) { + this.#mapSourceDropdown.selectValue(0); + this.setLayer(Object.keys(this.#mapLayers)[0]); } }) @@ -295,8 +321,7 @@ export class Map extends L.Map { } setLayer(layerName: string) { - if (this.#layer != null) - this.removeLayer(this.#layer) + this.eachLayer((layer) => this.removeLayer(layer)) let theatre = getApp().getMissionManager()?.getTheatre() ?? "Nevada"; @@ -308,16 +333,17 @@ export class Map extends L.Map { return new L.TileLayer(layer.urlTemplate.replace("{theatre}", theatre.toLowerCase()), layer); }) this.#layer = new L.LayerGroup(layers); + this.#layer?.addTo(this); } else { this.#layer = new L.TileLayer(layerData.urlTemplate, layerData); + this.#layer?.addTo(this); } - /* DCS core layers are handled here */ - } else if (["DCS Map mirror 1", "DCS Map mirror 2"].includes(layerName) ) { - let layerData = this.#mapLayers["ArcGIS Satellite"]; - let layers = [new L.TileLayer(layerData.urlTemplate, layerData)]; + /* mirrored layers are handled here */ + } else if (Object.keys(this.#mapMirrors).includes(layerName) ) { + let layers: L.TileLayer[] = []; /* Load the configuration file */ - const mirror = mapMirrors[layerName as keyof typeof mapMirrors]; + const mirror = this.#mapMirrors[layerName as any]; const request = new Request(mirror + "/config.json"); fetch(request).then((response) => { if (response.status === 200) { @@ -343,9 +369,7 @@ export class Map extends L.Map { } getLayers() { - let layers = ["DCS Map mirror 1", "DCS Map mirror 2"] - layers.push(...Object.keys(this.#mapLayers)); - return layers; + return Object.keys(this.#mapLayers); } /* State machine */