Initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.idea
|
||||
39
components/Circle.vue
Normal file
39
components/Circle.vue
Normal file
@@ -0,0 +1,39 @@
|
||||
<template>
|
||||
<div>Cirlce</div>
|
||||
</template>
|
||||
|
||||
<script >
|
||||
import { inject } from "vue";
|
||||
export default {
|
||||
props: {
|
||||
position: {
|
||||
required: true
|
||||
},
|
||||
radius: {
|
||||
required: true
|
||||
}
|
||||
},
|
||||
setup(props) {
|
||||
const mapPromise = inject(
|
||||
"mapPromise"
|
||||
);
|
||||
|
||||
if (mapPromise) {
|
||||
mapPromise.then((googleMap) => {
|
||||
new google.maps.Circle({
|
||||
strokeColor: "red",
|
||||
strokeOpacity: 0.8,
|
||||
strokeWeight: 2,
|
||||
fillColor: "#FF0000",
|
||||
fillOpacity: 0.35,
|
||||
map: googleMap,
|
||||
center: new google.maps.LatLng(props.position.lat, props.position.lng),
|
||||
radius: props.radius
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
};
|
||||
</script>
|
||||
72
components/Map.vue
Normal file
72
components/Map.vue
Normal file
@@ -0,0 +1,72 @@
|
||||
<template>
|
||||
<div id="map" ref="mapContainer">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Loader } from "../utils/load-google-maps";
|
||||
import { ref, provide } from "vue";
|
||||
export default {
|
||||
props: {
|
||||
center: {
|
||||
required: false
|
||||
},
|
||||
zoom: {
|
||||
type: Number,
|
||||
default: 12
|
||||
},
|
||||
mapTypeId: {
|
||||
default: "terrain"
|
||||
},
|
||||
style: {
|
||||
default: "width: 500px; height: 300px"
|
||||
},
|
||||
options: {
|
||||
zoomControl: true,
|
||||
mapTypeControl: false,
|
||||
scaleControl: false,
|
||||
streetViewControl: false,
|
||||
rotateControl: false,
|
||||
fullscreenControl: true,
|
||||
disableDefaultUI: false
|
||||
}
|
||||
},
|
||||
setup: function(props) {
|
||||
const mapContainer = ref(null);
|
||||
|
||||
const mapsLoader = new Loader({
|
||||
apiKey: "",
|
||||
version: "weekly",
|
||||
libraries: [
|
||||
"places",
|
||||
"drawing",
|
||||
"geometry",
|
||||
"visualization",
|
||||
"localContext"
|
||||
]
|
||||
});
|
||||
|
||||
const mapPromise = mapsLoader.load().then(() => {
|
||||
const map = new google.maps.Map(mapContainer.value, {
|
||||
zoom: props.zoom,
|
||||
center: new google.maps.LatLng(38.423733, 27.142826),
|
||||
mapTypeId: "terrain"
|
||||
});
|
||||
return map;
|
||||
});
|
||||
|
||||
provide("mapPromise", mapPromise);
|
||||
|
||||
return {
|
||||
mapContainer
|
||||
};
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#map {
|
||||
height: 80vh;
|
||||
}
|
||||
</style>
|
||||
42
components/Marker.vue
Normal file
42
components/Marker.vue
Normal file
@@ -0,0 +1,42 @@
|
||||
<template>
|
||||
<div>marker</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { inject } from "vue";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
location: {
|
||||
required: true
|
||||
}
|
||||
},
|
||||
setup(props) {
|
||||
const mapPromise = inject(
|
||||
"mapPromise"
|
||||
);
|
||||
|
||||
if (mapPromise) {
|
||||
mapPromise.then((googleMap) => {
|
||||
const infoWindow = new google.maps.InfoWindow();
|
||||
|
||||
console.log(props.location)
|
||||
const marker = new google.maps.Marker({
|
||||
position: new google.maps.LatLng(
|
||||
props.location.lat,
|
||||
props.location.lng
|
||||
),
|
||||
map: googleMap
|
||||
});
|
||||
|
||||
marker.addListener("click", (event) => {
|
||||
infoWindow.setContent(`hallo`);
|
||||
infoWindow.open(googleMap, marker);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
};
|
||||
</script>
|
||||
35
components/Polygon.vue
Normal file
35
components/Polygon.vue
Normal file
@@ -0,0 +1,35 @@
|
||||
<template>
|
||||
<div>marker</div>
|
||||
</template>
|
||||
|
||||
<script >
|
||||
import { inject } from "vue";
|
||||
export default {
|
||||
props: {
|
||||
coords: {
|
||||
}
|
||||
},
|
||||
setup(props) {
|
||||
|
||||
const mapPromise = inject(
|
||||
"mapPromise"
|
||||
);
|
||||
|
||||
if (mapPromise) {
|
||||
mapPromise.then((googleMap) => {
|
||||
const bermudaTriangle = new google.maps.Polygon({
|
||||
paths: props.coords,
|
||||
strokeColor: "#FF0000",
|
||||
strokeOpacity: 0.8,
|
||||
strokeWeight: 2,
|
||||
fillColor: "#FF0000",
|
||||
fillOpacity: 0.35
|
||||
});
|
||||
bermudaTriangle.setMap(googleMap);
|
||||
});
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
};
|
||||
</script>
|
||||
38
components/Rectangle.vue
Normal file
38
components/Rectangle.vue
Normal file
@@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<div>
|
||||
auto complete
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script >
|
||||
import { inject } from "vue";
|
||||
|
||||
export default {
|
||||
props: {
|
||||
bounds: {
|
||||
required: true
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const mapPromise = inject(
|
||||
"mapPromise"
|
||||
);
|
||||
|
||||
if (mapPromise) {
|
||||
mapPromise.then((map) => {
|
||||
const rectangle = new google.maps.Rectangle({
|
||||
strokeColor: "#FF0000",
|
||||
strokeOpacity: 0.8,
|
||||
strokeWeight: 2,
|
||||
fillColor: "#FF0000",
|
||||
fillOpacity: 0.35,
|
||||
map,
|
||||
bounds: props.bounds
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
};
|
||||
</script>
|
||||
16
index.js
Normal file
16
index.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import GoogleMap from './components/Map'
|
||||
import Marker from './components/Marker'
|
||||
import Circle from './components/Circle'
|
||||
import Polygon from './components/Polygon'
|
||||
import Rectangle from './components/Rectangle'
|
||||
|
||||
export default {
|
||||
install: (app, options) => {
|
||||
app.component('GoogleMap', GoogleMap)
|
||||
app.component('Marker', Marker)
|
||||
app.component('Circle', Circle)
|
||||
app.component('Polygon', Polygon)
|
||||
app.component('Rectangle', Rectangle)
|
||||
app.provide('apiKey', options.apiKey)
|
||||
}
|
||||
}
|
||||
5
package-lock.json
generated
Normal file
5
package-lock.json
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"name": "@fawmi/vue-google-maps",
|
||||
"version": "0.0.34",
|
||||
"lockfileVersion": 1
|
||||
}
|
||||
21
package.json
Normal file
21
package.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "@fawmi/vue-google-maps",
|
||||
"description": "Google Map components for Vue.js 3",
|
||||
"version": "0.0.34",
|
||||
"private": false,
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/fawmi/vue-google-maps.git"
|
||||
},
|
||||
"author": "Fawad Mirzad",
|
||||
"license": "ISC",
|
||||
"bugs": {
|
||||
"url": "https://github.com/fawmi/vue-google-maps/issues"
|
||||
},
|
||||
"homepage": "https://vue-map.netlify.app",
|
||||
"dependencies": {}
|
||||
}
|
||||
143
utils/load-google-maps.js
Normal file
143
utils/load-google-maps.js
Normal file
@@ -0,0 +1,143 @@
|
||||
export class Loader {
|
||||
constructor({
|
||||
apiKey,
|
||||
libraries = [],
|
||||
language,
|
||||
region,
|
||||
version,
|
||||
mapIds
|
||||
}) {
|
||||
// @ts-ignore
|
||||
this.callbacks = [];
|
||||
this.CALLBACK = "__googleMapsCallback";
|
||||
this.version = version;
|
||||
this.apiKey = apiKey;
|
||||
this.libraries = libraries;
|
||||
// @ts-ignore
|
||||
this.language = language;
|
||||
// @ts-ignore
|
||||
this.region = region;
|
||||
this.URL = 'https://maps.googleapis.com/maps/api/js';
|
||||
// @ts-ignore
|
||||
this.mapIds = mapIds;
|
||||
}
|
||||
/**
|
||||
* CreateUrl returns the Google Maps JavaScript API script url given the [[LoaderOptions]].
|
||||
*
|
||||
* @ignore
|
||||
*/
|
||||
createUrl() {
|
||||
let url = this.URL;
|
||||
console.log(this.URL)
|
||||
|
||||
url += `?callback=${this.CALLBACK}`;
|
||||
|
||||
if (this.apiKey) {
|
||||
url += `&key=${this.apiKey}`;
|
||||
}
|
||||
|
||||
if (this.libraries.length > 0) {
|
||||
url += `&libraries=${this.libraries.join(",")}`;
|
||||
}
|
||||
|
||||
if (this.language) {
|
||||
url += `&language=${this.language}`;
|
||||
}
|
||||
|
||||
if (this.region) {
|
||||
url += `®ion=${this.region}`;
|
||||
}
|
||||
|
||||
if (this.version) {
|
||||
url += `&v=${this.version}`;
|
||||
}
|
||||
|
||||
if (this.mapIds) {
|
||||
url += `&map_ids=${this.mapIds.join(",")}`;
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the Google Maps JavaScript API script and return a Promise.
|
||||
*/
|
||||
load() {
|
||||
return this.loadPromise();
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the Google Maps JavaScript API script and return a Promise.
|
||||
*
|
||||
* @ignore
|
||||
*/
|
||||
loadPromise() {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.loadCallback((err) => {
|
||||
if (!err) {
|
||||
resolve();
|
||||
} else {
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the Google Maps JavaScript API script with a callback.
|
||||
*/
|
||||
loadCallback(fn) {
|
||||
this.callbacks.push(fn);
|
||||
this.execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the script on document.
|
||||
*/
|
||||
setScript() {
|
||||
const url = this.createUrl();
|
||||
const script = document.createElement("script");
|
||||
|
||||
script.type = "text/javascript";
|
||||
script.src = url;
|
||||
// @ts-ignore
|
||||
script.onerror = this.loadErrorCallback.bind(this);
|
||||
script.defer = true;
|
||||
script.async = true;
|
||||
document.head.appendChild(script);
|
||||
}
|
||||
|
||||
loadErrorCallback(e) {
|
||||
this.onerrorEvent = e;
|
||||
this.callback();
|
||||
}
|
||||
|
||||
setCallback() {
|
||||
window.__googleMapsCallback = this.callback.bind(this);
|
||||
}
|
||||
|
||||
callback() {
|
||||
this.done = true;
|
||||
this.loading = false;
|
||||
|
||||
this.callbacks.forEach(cb => {
|
||||
cb(this.onerrorEvent);
|
||||
});
|
||||
|
||||
this.callbacks = [];
|
||||
}
|
||||
|
||||
execute() {
|
||||
if (this.done) {
|
||||
this.callback();
|
||||
} else {
|
||||
if (this.loading) {
|
||||
// do nothing but wait
|
||||
} else {
|
||||
this.loading = true;
|
||||
this.setCallback();
|
||||
this.setScript();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user