Map.vue 3.0 KB

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