Map.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <!--
  2. Leaflet map
  3. @see https://leafletjs.com/
  4. -->
  5. <template>
  6. <div id="map-wrap">
  7. <client-only>
  8. <l-map :zoom="zoom" :center="center">
  9. <l-tile-layer :url="layerUrl" />
  10. <l-marker
  11. :lat-lng="latLong"
  12. draggable
  13. @update:latLng="onMoveMarker"
  14. />
  15. </l-map>
  16. <v-btn class="mr-4 ot_green ot_white--text" @click="updateMap">
  17. {{ $t('updateMap') }}
  18. </v-btn>
  19. </client-only>
  20. </div>
  21. </template>
  22. <script lang="ts">
  23. import {
  24. defineComponent, computed, ref, toRefs, useContext, ComputedRef, Ref, ToRefs
  25. } from '@nuxtjs/composition-api'
  26. import { QUERY_TYPE, TYPE_ALERT } from '~/types/enums'
  27. import { AddressPostal } from '~/models/Core/AddressPostal'
  28. import { AnyJson, alert } from '~/types/interfaces'
  29. export default defineComponent({
  30. props: {
  31. address: {
  32. type: Object as () => AddressPostal,
  33. required: true
  34. },
  35. zoom: {
  36. type: Number,
  37. required: true
  38. }
  39. },
  40. setup (props, { emit }) {
  41. const { $dataProvider, store } = useContext()
  42. const { address }: ToRefs = toRefs(props)
  43. const latitude: Ref<number> = ref(address.value.latitude)
  44. const longitude: Ref<number> = ref(address.value.longitude)
  45. const center: ComputedRef<Array<number>> = computed(() => [latitude.value, longitude.value])
  46. const latLong: ComputedRef<Array<number>> = computed(() => [latitude.value, longitude.value])
  47. const layerUrl: string = 'https://{s}.tile.osm.org/{z}/{x}/{y}.png'
  48. const updateMap = async () => {
  49. const response = await $dataProvider.invoke({
  50. type: QUERY_TYPE.DEFAULT,
  51. url: `gps-coordinate-searching?street=${address.value.streetAddress} ${address.value.streetAddressSecond} ${address.value.streetAddressThird}&cp=${address.value.postalCode}&city=${address.value.addressCity}`
  52. })
  53. if (response.length > 0) {
  54. latitude.value = response[0].latitude
  55. longitude.value = response[0].longitude
  56. address.value.latitude = response[0].latitude
  57. address.value.longitude = response[0].longitude
  58. emit('updateAddress', address.value)
  59. } else {
  60. const alert: alert = {
  61. type: TYPE_ALERT.ALERT,
  62. message: 'no_coordinate_corresponding'
  63. }
  64. store.commit('page/setAlert', alert)
  65. }
  66. }
  67. const onMoveMarker = async (event: AnyJson) => {
  68. const response = await $dataProvider.invoke({
  69. type: QUERY_TYPE.DEFAULT,
  70. url: `gps-coordinate-reverse/${event.lat}/${event.lng}`
  71. })
  72. address.value.streetAddress = response.streetAddress
  73. address.value.streetAddressSecond = response.streetAddressSecond
  74. address.value.streetAddressThird = response.streetAddressThird
  75. address.value.postalCode = response.cp
  76. address.value.addressCity = response.city
  77. emit('updateAddress', address.value)
  78. }
  79. return {
  80. updateMap,
  81. center,
  82. latLong,
  83. layerUrl,
  84. onMoveMarker
  85. }
  86. }
  87. })
  88. </script>
  89. <style scoped>
  90. #map-wrap{
  91. height: 30vh;
  92. }
  93. </style>