Map.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 mt-2 mb-2 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 ?? 0.0)
  44. const longitude: Ref<number> = ref(address.value.longitude ?? 0.0)
  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: `/api/gps-coordinate-searching?street=${address.value.streetAddress}&cp=${address.value.postalCode}&city=${address.value.addressCity}`
  52. })
  53. const data = response.data
  54. if (data.length > 0) {
  55. latitude.value = data[0].latitude
  56. longitude.value = data[0].longitude
  57. address.value.latitude = data[0].latitude
  58. address.value.longitude = data[0].longitude
  59. emit('updateAddress', address.value)
  60. } else {
  61. const alert: alert = {
  62. type: TYPE_ALERT.ALERT,
  63. message: 'no_coordinate_corresponding'
  64. }
  65. store.commit('page/setAlert', alert)
  66. }
  67. }
  68. const onMoveMarker = async (event: AnyJson) => {
  69. if(event){
  70. address.value.latitude = event.lat
  71. address.value.longitude = event.lng
  72. emit('updateAddress', address.value)
  73. }
  74. }
  75. return {
  76. updateMap,
  77. center,
  78. latLong,
  79. layerUrl,
  80. onMoveMarker
  81. }
  82. }
  83. })
  84. </script>
  85. <style scoped>
  86. #map-wrap{
  87. height: 30vh;
  88. }
  89. </style>