Map.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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, ComputedRef, Ref} 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. import {ToRefs} from "@vue/composition-api";
  24. export default defineComponent({
  25. props:{
  26. address:{
  27. type: Object as () => AddressPostal,
  28. required: true
  29. },
  30. zoom:{
  31. type: Number,
  32. required: true
  33. }
  34. },
  35. setup(props, {emit}){
  36. const {$dataProvider, store} = useContext()
  37. const {address}:ToRefs = toRefs(props)
  38. const latitude:Ref<number> = ref(address.value.latitude)
  39. const longitude:Ref<number> = ref(address.value.longitude)
  40. const center:ComputedRef<Array<number>> = computed(() => [latitude.value,longitude.value])
  41. const latLong:ComputedRef<Array<number>> = computed(() => [latitude.value,longitude.value])
  42. const layerUrl:string = 'https://{s}.tile.osm.org/{z}/{x}/{y}.png'
  43. const updateMap = async () => {
  44. let response = await $dataProvider.invoke({
  45. type: QUERY_TYPE.DEFAULT,
  46. url: `gps-coordinate-searching?street=${address.value.streetAddress} ${address.value.streetAddressSecond} ${address.value.streetAddressThird}&cp=${address.value.postalCode}&city=${address.value.addressCity}`
  47. })
  48. if(response.length > 0){
  49. latitude.value = response[0].latitude
  50. longitude.value = response[0].longitude
  51. address.value.latitude = response[0].latitude
  52. address.value.longitude = response[0].longitude
  53. emit('updateAddress', address.value)
  54. }else{
  55. const alert:alert = {
  56. type: TYPE_ALERT.ALERT,
  57. message: 'no_coordinate_corresponding'
  58. }
  59. store.commit('page/setAlert', alert)
  60. }
  61. }
  62. const onMoveMarker = async (event:AnyJson) => {
  63. let response = await $dataProvider.invoke({
  64. type: QUERY_TYPE.DEFAULT,
  65. url: `gps-coordinate-reverse/${event.lat}/${event.lng}`
  66. })
  67. address.value.streetAddress = response.streetAddress
  68. address.value.streetAddressSecond = response.streetAddressSecond
  69. address.value.streetAddressThird = response.streetAddressThird
  70. address.value.postalCode = response.cp
  71. address.value.addressCity = response.city
  72. emit('updateAddress', address.value)
  73. }
  74. return {
  75. updateMap,
  76. center,
  77. latLong,
  78. layerUrl,
  79. onMoveMarker
  80. }
  81. }
  82. })
  83. </script>
  84. <style scoped>
  85. #map-wrap{
  86. height: 30vh;
  87. }
  88. </style>