Skip to content

Commit 8f6415a

Browse files
authored
Merge pull request #920 from SlideRuleEarth/carlos-dev4
Carlos dev4
2 parents ecf7600 + aa85b88 commit 8f6415a

13 files changed

+845
-380
lines changed

web-client/src/components/SrAnalysisMap.vue

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ const { addPolarOverlay, removePolarOverlay } = usePolarOverlay({
7070
zIndex: 100
7171
})
7272
73-
const template = 'Lat:{y}\u00B0, Long:{x}\u00B0'
73+
const template = '{y}\u00B0, {x}\u00B0'
7474
const stringifyFunc = (coordinate: Coordinate) => {
7575
const projName = computedProjName.value
7676
let newProj = getProjection(projName)
@@ -1206,13 +1206,13 @@ function handleSaveTooltip() {
12061206
:deep(.sr-legend-control) {
12071207
background: rgba(255, 255, 255, 0.25);
12081208
bottom: 0.25rem;
1209-
right: 3.5rem;
1209+
right: 10rem;
12101210
}
12111211
12121212
:deep(.sr-col-menu-sel-control) {
12131213
top: auto;
12141214
bottom: 0.25rem;
1215-
right: 15.5rem;
1215+
right: 3.5rem;
12161216
border-radius: var(--p-border-radius);
12171217
}
12181218
@@ -1279,48 +1279,48 @@ function handleSaveTooltip() {
12791279
}
12801280
12811281
:deep(.ol-zoom) {
1282-
top: 0.5rem;
1283-
right: 0.75rem; /* right align -- override the default */
1282+
top: 2rem;
1283+
right: 0.5rem; /* right align -- match layer switcher and attribution */
12841284
left: auto; /* Override the default positioning */
1285-
background-color: black;
1285+
background: color-mix(in srgb, var(--p-primary-color) 20%, transparent);
1286+
border: 1px solid var(--p-primary-color);
12861287
border-radius: var(--p-border-radius);
12871288
margin: auto;
12881289
font-size: 0.75rem;
12891290
z-index: 99999; /* Ensure it stays on top */
12901291
}
12911292
1293+
:deep(.ol-zoom:hover) {
1294+
background: color-mix(in srgb, var(--p-primary-color) 40%, transparent);
1295+
}
1296+
12921297
:deep(.ol-zoom button) {
12931298
width: 1.5rem; /* Smaller button size */
12941299
height: 1.5rem;
1300+
color: black;
1301+
background: transparent;
12951302
}
12961303
12971304
:deep(.ol-zoom .ol-zoom-in),
12981305
:deep(.ol-zoom .ol-zoom-out) {
12991306
position: relative;
13001307
margin: 1px;
13011308
border-radius: var(--p-border-radius);
1302-
background-color: black;
1303-
color: var(--ol-font-color);
1309+
background: rgba(255, 255, 255, 0.3);
1310+
color: black;
13041311
font-size: 1rem; /* Reduce text size in buttons */
13051312
font-weight: normal;
13061313
}
13071314
1308-
:deep(.ol-zoom .ol-zoom-out):active {
1309-
background-color: rgba(60, 60, 60, 1); /* Change color on hover */
1310-
transform: translateY(2px); /* Slight downward movement to simulate press */
1311-
}
1312-
1313-
:deep(.ol-zoom .ol-zoom-out):hover {
1314-
background-color: rgba(60, 60, 60, 1); /* Change color on hover */
1315-
}
1316-
1315+
:deep(.ol-zoom .ol-zoom-out):active,
13171316
:deep(.ol-zoom .ol-zoom-in):active {
1318-
background-color: rgba(60, 60, 60, 1); /* Change color on hover */
1319-
transform: translateY(2px); /* Slight downward movement to simulate press */
1317+
background: color-mix(in srgb, var(--p-primary-color) 50%, transparent);
1318+
transform: translateY(1px); /* Slight downward movement to simulate press */
13201319
}
13211320
1321+
:deep(.ol-zoom .ol-zoom-out):hover,
13221322
:deep(.ol-zoom .ol-zoom-in):hover {
1323-
background-color: rgba(60, 60, 60, 1); /* Change color on hover */
1323+
background: rgba(255, 255, 255, 0.5);
13241324
}
13251325
13261326
:deep(.ol-zoom .ol-zoom-out):before {
@@ -1329,32 +1329,31 @@ function handleSaveTooltip() {
13291329
top: 0px;
13301330
left: 25%; /* Adjust this value to control where the border starts */
13311331
right: 25%; /* Adjust this value to control where the border ends */
1332-
border-top: 1px dashed rgb(200, 200, 200);
1332+
border-top: 1px dashed var(--p-primary-color);
13331333
}
13341334
13351335
:deep(.ol-control.sr-baselayer-control) {
13361336
top: 0.25rem;
13371337
bottom: auto;
1338-
right: 3rem;
1338+
right: 0.5rem;
13391339
left: auto;
13401340
border-radius: var(--p-border-radius);
13411341
color: white;
13421342
max-width: 30rem;
1343-
background: rgba(255, 255, 255, 0.25);
1343+
background: transparent;
13441344
}
13451345
13461346
:deep(.ol-control.sr-graticule-control) {
13471347
top: auto;
1348-
bottom: 2.125rem;
1349-
right: auto;
1350-
left: 0rem;
1351-
margin: 0.125rem;
1348+
bottom: 0.25rem;
1349+
right: 23rem;
1350+
left: auto;
1351+
margin: 0;
13521352
border-radius: var(--p-border-radius);
1353-
background: rgba(255, 255, 255, 0.8);
13541353
}
13551354
13561355
:deep(.ol-scale-line) {
1357-
bottom: 0.5rem;
1356+
bottom: 0.25rem;
13581357
left: 0.5rem;
13591358
background: rgba(255, 255, 255, 0.25);
13601359
border-radius: var(--p-border-radius);
@@ -1367,24 +1366,35 @@ function handleSaveTooltip() {
13671366
13681367
/* Layer Switcher Control */
13691368
:deep(.ol-control.ol-layerswitcher) {
1370-
top: 5rem;
1369+
top: 6.5rem;
13711370
bottom: auto;
13721371
left: auto;
13731372
right: 0.5rem;
1374-
background-color: transparent;
1373+
background: color-mix(in srgb, var(--p-primary-color) 20%, transparent);
1374+
border: 1px solid var(--p-primary-color);
13751375
border-radius: var(--p-border-radius);
13761376
z-index: 10000; /* Above Deck.gl overlay */
13771377
}
13781378
1379+
:deep(.ol-control.ol-layerswitcher:hover) {
1380+
background: color-mix(in srgb, var(--p-primary-color) 40%, transparent);
1381+
}
1382+
13791383
:deep(.ol-control.ol-layerswitcher > button) {
13801384
width: 1.5rem;
13811385
height: 1.5rem;
13821386
padding: 0;
1383-
background: transparent;
1387+
background: rgba(255, 255, 255, 0.3);
1388+
border-radius: var(--p-border-radius);
13841389
display: grid;
13851390
place-items: center;
13861391
line-height: 1;
13871392
font-size: 1rem;
1393+
color: black;
1394+
}
1395+
1396+
:deep(.ol-control.ol-layerswitcher > button:hover) {
1397+
background: rgba(255, 255, 255, 0.5);
13881398
}
13891399
13901400
:deep(.ol-control.ol-layerswitcher .panel-container) {
Lines changed: 67 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<script setup lang="ts">
2-
import { ref, onMounted, onUnmounted } from 'vue'
2+
import { ref, onMounted, onUnmounted, watch, computed } from 'vue'
33
import { Control } from 'ol/control'
44
import { getBaseLayersForView } from '@/composables/SrViews'
55
import { isGoogleLayerAvailable } from '@/composables/SrLayers'
66
import { useMapStore } from '@/stores/mapStore'
7-
import SrMenu from './SrMenu.vue'
7+
import Select from 'primevue/select'
88
import { useToast } from 'primevue/usetoast'
99
import { createLogger } from '@/utils/logger'
1010
@@ -14,6 +14,7 @@ const mapStore = useMapStore()
1414
const toast = useToast()
1515
const baseLayerControlElement = ref<HTMLElement | null>(null)
1616
const previousBaseLayer = ref<string>(mapStore.selectedBaseLayer)
17+
const selectedBaseLayer = ref(mapStore.selectedBaseLayer)
1718
1819
const emit = defineEmits<{
1920
(_e: 'baselayer-control-created', _control: Control): void
@@ -22,12 +23,15 @@ const emit = defineEmits<{
2223
2324
let customControl: Control | null = null
2425
26+
const baseLayerOptions = computed(() => getBaseLayersForView(mapStore.selectedView).value)
27+
2528
onMounted(() => {
2629
if (baseLayerControlElement.value) {
2730
customControl = new Control({ element: baseLayerControlElement.value })
2831
emit('baselayer-control-created', customControl)
2932
}
3033
previousBaseLayer.value = mapStore.selectedBaseLayer
34+
selectedBaseLayer.value = mapStore.selectedBaseLayer
3135
})
3236
3337
onUnmounted(() => {
@@ -36,11 +40,10 @@ onUnmounted(() => {
3640
}
3741
})
3842
39-
function updateBaseLayer(_event: Event) {
40-
const selectedLayer = mapStore.selectedBaseLayer
41-
43+
// Watch for local selection changes
44+
watch(selectedBaseLayer, (newLayer) => {
4245
// Check if user selected Google without a valid API key
43-
if (selectedLayer === 'Google' && !isGoogleLayerAvailable()) {
46+
if (newLayer === 'Google' && !isGoogleLayerAvailable()) {
4447
logger.warn('Google base layer selected but no API key configured')
4548
4649
// Show toast prompting user to add API key
@@ -53,43 +56,78 @@ function updateBaseLayer(_event: Event) {
5356
})
5457
5558
// Revert to previous base layer
56-
mapStore.setSelectedBaseLayer(previousBaseLayer.value)
59+
selectedBaseLayer.value = previousBaseLayer.value
5760
return
5861
}
5962
60-
// Update previous layer for next time
61-
previousBaseLayer.value = selectedLayer
63+
// Update store and previous layer
64+
mapStore.setSelectedBaseLayer(newLayer)
65+
previousBaseLayer.value = newLayer
6266
63-
emit('update-baselayer', selectedLayer)
64-
logger.debug('updateBaseLayer', { event: _event, selectedBaseLayer: selectedLayer })
65-
}
67+
emit('update-baselayer', newLayer)
68+
logger.debug('updateBaseLayer', { selectedBaseLayer: newLayer })
69+
})
70+
71+
// Watch for external changes to the store
72+
watch(
73+
() => mapStore.selectedBaseLayer,
74+
(newLayer) => {
75+
if (newLayer !== selectedBaseLayer.value) {
76+
selectedBaseLayer.value = newLayer
77+
}
78+
}
79+
)
6680
</script>
6781

6882
<template>
6983
<div ref="baseLayerControlElement" class="sr-baselayer-control ol-unselectable ol-control">
70-
<SrMenu
71-
v-model="mapStore.selectedBaseLayer"
72-
@change="updateBaseLayer"
73-
:menuOptions="getBaseLayersForView(mapStore.selectedView).value"
74-
:getSelectedMenuItem="mapStore.getSelectedBaseLayer"
75-
:setSelectedMenuItem="mapStore.setSelectedBaseLayer"
76-
tooltipText="Base Map Layer"
84+
<Select
85+
v-model="selectedBaseLayer"
86+
:options="baseLayerOptions"
87+
v-tooltip.top="'Base Map Layer'"
88+
class="sr-baselayer-select"
89+
size="small"
7790
/>
7891
</div>
7992
</template>
8093

8194
<style scoped>
82-
.ol-control.sr-baselayer-control .select-baseLayer select {
83-
color: white;
84-
background-color: black;
85-
border-radius: var(--p-border-radius);
95+
.sr-baselayer-control {
96+
background-color: transparent;
97+
}
98+
99+
.sr-baselayer-select {
100+
min-width: 8rem;
101+
}
102+
103+
:deep(.p-select) {
104+
background: color-mix(in srgb, var(--p-primary-color) 20%, transparent);
105+
border: 1px solid var(--p-primary-color);
106+
padding: 0 0.25rem;
107+
min-height: 0;
108+
height: 1.4rem;
109+
display: flex;
110+
align-items: center;
111+
}
112+
113+
:deep(.p-select:hover) {
114+
background: color-mix(in srgb, var(--p-primary-color) 40%, transparent);
115+
}
116+
117+
:deep(.p-select-label) {
118+
color: black;
119+
font-weight: 500;
120+
font-size: 0.7rem;
121+
padding: 0;
122+
display: flex;
123+
align-items: center;
86124
}
87125
88-
.sr-baselayer-control .sr-baselayer-button-box {
89-
display: flex; /* Aligns children (input and icon) in a row */
90-
flex-direction: row; /* Stack children horizontally */
91-
align-items: center; /* Centers children vertically */
92-
justify-content: center; /* Centers children horizontally */
93-
margin: 0px;
126+
:deep(.p-select-dropdown) {
127+
color: black;
128+
width: 1.25rem;
129+
padding: 0;
130+
display: flex;
131+
align-items: center;
94132
}
95133
</style>

0 commit comments

Comments
 (0)