Skip to content

Commit afbbda4

Browse files
committed
Refactoring marker-layer & popup
1 parent 7f8bf6e commit afbbda4

File tree

6 files changed

+227
-231
lines changed

6 files changed

+227
-231
lines changed

web/src/pages/map/index.vue

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,17 @@
3838
</side-pannel>
3939
<l-map
4040
:item-state="itemState"
41-
:issue-uuid="issueUuid"
4241
:map-state="mapState"
43-
:remote-url-read="remote_url_read"
4442
@set-map="setMap($event)"
45-
@set-marker-layer="markerLayer = $event"
46-
@update-issue-uuid="issueUuid = $event"
4743
class="map"
4844
/>
45+
<MarkerLayer v-if="map" ref="markerLayer" :map="map" />
46+
<OsmObject
47+
v-if="map"
48+
ref="osmObject"
49+
:map="map"
50+
:remote-url-read="remote_url_read"
51+
/>
4952
<side-pannel
5053
ref="doc"
5154
:map="map"
@@ -70,21 +73,28 @@
7073
:main_website="main_website"
7174
:user="user"
7275
:issue="editor"
73-
@issue-done="markerLayer.corrected()"
74-
@close="$refs.editor.hide()"
76+
@issue-done="$refs.popup.corrected()"
7577
/>
7678
</side-pannel>
7779
</div>
7880
<iframe id="hiddenIframe" name="hiddenIframe"></iframe>
7981
<popup
82+
ref="popup"
83+
v-if="map"
84+
:map="map"
85+
:initial-uuid="issueUuid"
8086
:main_website="main_website"
8187
:remote_url_read="remote_url_read"
82-
:marker-layer="markerLayer"
88+
@update-issue-uuid="issueUuid = $event"
89+
@q="$refs.osmObject.select($event)"
90+
@remove-marker="$refs.markerLayer.remove($event)"
8391
@fix-edit="
8492
$refs.doc.hide()
8593
$refs.editor.show()
8694
editor = [$event.uuid, $event.fix]
8795
"
96+
@show-doc="showDoc"
97+
@load-doc="loadDoc"
8898
/>
8999
</div>
90100
</div>
@@ -99,10 +109,11 @@ import ItemsFilters from './items-filters.vue'
99109
import ItemsList from './items-list.vue'
100110
import Items from './items.vue'
101111
import LMap from './map.vue'
112+
import MarkerLayer from './marker-layer.vue'
113+
import OsmObject from './osm-object.vue'
102114
import Popup from './popup.vue'
103115
import SidePannel from './side-pannel.vue'
104116
import Top from './top.vue'
105-
import ExternalVueAppEvent from '../../ExternalVueAppEvent'
106117
import { ItemState, LanguagesName, Category } from '../../types'
107118
import VueParent from '../Parent.vue'
108119
@@ -125,7 +136,6 @@ export default VueParent.extend({
125136
main_website: string
126137
remote_url_read: string
127138
map: Map
128-
markerLayer: Object
129139
item_levels: {}
130140
itemState: ItemState
131141
issueUuid: string
@@ -145,7 +155,6 @@ export default VueParent.extend({
145155
main_website: '',
146156
remote_url_read: '',
147157
map: null,
148-
markerLayer: null,
149158
item_levels: {},
150159
itemState: {
151160
item: 'xxxx',
@@ -180,6 +189,8 @@ export default VueParent.extend({
180189
Doc,
181190
Editor,
182191
Popup,
192+
MarkerLayer,
193+
OsmObject,
183194
},
184195
185196
created(): void {
@@ -192,14 +203,6 @@ export default VueParent.extend({
192203
193204
mounted(): void {
194205
this.setData()
195-
196-
ExternalVueAppEvent.$on('show-doc', (e) => {
197-
this.$refs.doc?.show()
198-
this.doc = [e.item, e.classs]
199-
})
200-
ExternalVueAppEvent.$on('load-doc', (e) => {
201-
this.doc = [e.item, e.classs]
202-
})
203206
},
204207
205208
watch: {
@@ -371,6 +374,15 @@ export default VueParent.extend({
371374
})
372375
})
373376
},
377+
378+
showDoc(e) {
379+
this.$refs.doc?.show()
380+
this.doc = [e.item, e.classs]
381+
},
382+
383+
loadDoc(e) {
384+
this.doc = [e.item, e.classs]
385+
},
374386
},
375387
})
376388
</script>

web/src/pages/map/map.vue

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
<template>
2-
<div id="map">
3-
<OsmoseMarker
4-
v-if="map"
5-
ref="osmoseMarker"
6-
:map="map"
7-
:initial-uuid="issueUuid"
8-
:remote-url-read="remoteUrlRead"
9-
@update-issue-uuid="$emit('update-issue-uuid', $event)"
10-
/>
11-
</div>
2+
<div id="map"></div>
123
</template>
134

145
<script lang="ts">
@@ -23,7 +14,6 @@ import {
2314
} from 'maplibre-gl'
2415
import Vue from 'vue'
2516
26-
import OsmoseMarker from './osmose-marker.vue'
2717
import ControlLayers from '../../../static/map/ControlLayers'
2818
import { mapBases, mapOverlay, glStyle } from '../../../static/map/layers'
2919
@@ -37,18 +27,10 @@ export default Vue.extend({
3727
type: Object,
3828
required: true,
3929
},
40-
issueUuid: {
41-
type: String,
42-
default: undefined,
43-
},
4430
mapState: {
4531
type: Object,
4632
required: true,
4733
},
48-
remoteUrlRead: {
49-
type: String,
50-
required: true,
51-
},
5234
},
5335
5436
data(): {
@@ -59,10 +41,6 @@ export default Vue.extend({
5941
}
6042
},
6143
62-
components: {
63-
OsmoseMarker,
64-
},
65-
6644
watch: {
6745
itemState: {
6846
deep: true,
@@ -150,7 +128,6 @@ export default Vue.extend({
150128
map.addControl(new ControlLayers(mapBases, mapOverlay), 'top-right')
151129
152130
map.on('load', () => {
153-
this.$emit('set-marker-layer', this.$refs.osmoseMarker)
154131
this.updateLayer()
155132
})
156133

web/src/pages/map/marker-layer.vue

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<template></template>
2+
3+
<script lang="ts">
4+
import { Map } from 'maplibre-gl'
5+
import Vue, { PropType } from 'vue'
6+
7+
export default Vue.extend({
8+
props: {
9+
map: {
10+
type: Object as PropType<Map>,
11+
required: true,
12+
},
13+
},
14+
15+
mounted(): void {
16+
this.map.on('load', () => {
17+
this.map.on('mouseenter', 'markers', () => {
18+
this.map.getCanvas().style.cursor = 'pointer'
19+
})
20+
21+
this.map.on('mouseleave', 'markers', () => {
22+
this.map.getCanvas().style.cursor = ''
23+
})
24+
})
25+
},
26+
27+
methods: {
28+
remove(featureId): void {
29+
this.map.setFeatureState(
30+
{ source: 'markers', sourceLayer: 'issues', id: featureId },
31+
{ hidden: true }
32+
)
33+
},
34+
},
35+
})
36+
</script>

web/src/pages/map/osm-object.vue

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<template></template>
2+
3+
<script lang="ts">
4+
import { Map } from 'maplibre-gl'
5+
import Vue, { PropType } from 'vue'
6+
7+
import osm2geojson from '../../../static/map/osm2geojson'
8+
9+
export default Vue.extend({
10+
props: {
11+
map: {
12+
type: Object as PropType<Map>,
13+
required: true,
14+
},
15+
remoteUrlRead: {
16+
type: String,
17+
required: true,
18+
},
19+
},
20+
21+
methods: {
22+
async select(data) {
23+
data.elems_id = data.elems.map((elem) => elem.type + elem.id).join(',')
24+
25+
// Get the OSM objects
26+
if (data.elems_id) {
27+
this.clear()
28+
const features = await Promise.all(
29+
data.elems.map((elem) =>
30+
fetch(
31+
elem.type === 'node'
32+
? `${this.remoteUrlRead}api/0.6/node/${elem.id}`
33+
: `${this.remoteUrlRead}api/0.6/${elem.type}/${elem.id}/full`
34+
)
35+
.then((response) => response.text())
36+
.then((str) =>
37+
new window.DOMParser().parseFromString(str, 'text/xml')
38+
)
39+
.then((xml) => osm2geojson(xml).features)
40+
)
41+
)
42+
this.map.getSource('osm').setData({
43+
type: 'FeatureCollection',
44+
features: features.flat(),
45+
})
46+
}
47+
},
48+
49+
clear(): void {
50+
this.map.getSource('osm').setData({
51+
type: 'FeatureCollection',
52+
features: [],
53+
})
54+
},
55+
},
56+
})
57+
</script>

0 commit comments

Comments
 (0)