Skip to content
This repository has been archived by the owner on Oct 7, 2021. It is now read-only.

Commit

Permalink
Updated the solution to work with v8.0+ instead of v9.0+.
Browse files Browse the repository at this point in the history
  • Loading branch information
DynamicsNinja committed Mar 7, 2018
1 parent 0448d48 commit 25cdf40
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 151 deletions.
2 changes: 1 addition & 1 deletion CrmGoogleMaps/html/apiKeyConfiguration.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<body style="word-wrap: break-word;">
<div id="top">
<span id="TopTitle">CRM Google Maps</span>
<span class="Version">v1.2.0.0</span>
<span class="Version">v1.3.0</span>
<a href="https://www.paypal.me/ivanficko" target="_blank" class="TopImage">
<img class="HeaderImage" title="Feel free to donate if this saved you some time" alt="PayPal" src="data:image/png;base64,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">
</a>
Expand Down
Binary file added CrmGoogleMaps/img/refresh.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 0 additions & 4 deletions CrmGoogleMaps/img/refresh.svg

This file was deleted.

10 changes: 5 additions & 5 deletions CrmGoogleMaps/js/apiKeyConfiguration.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
function getStoredApiKey() {
var req = new XMLHttpRequest();
req.open("GET",
Xrm.Page.context.getClientUrl() + "/api/data/v8.2/fic_googlemapsconfigurations?$select=fic_apikey,fic_usegoogleaddress,fic_markericon,fic_defaultzoom",
Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations?$select=fic_apikey,fic_usegoogleaddress,fic_markericon,fic_defaultzoom",
true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
Expand Down Expand Up @@ -40,7 +40,7 @@ function createKey(apiKey) {
entity.fic_markericon = $('#markerIcon').val();
entity.fic_defaultzoom = $('#defaultzoom').val();
var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/fic_googlemapsconfigurations", true);
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
Expand Down Expand Up @@ -70,7 +70,7 @@ function updateKey(key, id) {
entity.fic_defaultzoom = $('#defaultzoom').val();
var req = new XMLHttpRequest();
req.open("PATCH",
Xrm.Page.context.getClientUrl() + "/api/data/v8.2/fic_googlemapsconfigurations(" + id + ")",
Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations(" + id + ")",
true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
Expand All @@ -95,7 +95,7 @@ function updateKey(key, id) {

function upsertKey(key) {
var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/fic_googlemapsconfigurations", true);
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
Expand All @@ -119,6 +119,7 @@ function upsertKey(key) {
req.send();
}

var VERSION = parent.Xrm.Page.context.getVersion() != "" ? parent.Xrm.Page.context.getVersion().substring(0, 3) : "8.0";
getStoredApiKey();
document.getElementById("update").addEventListener("click",
function () {
Expand Down Expand Up @@ -154,4 +155,3 @@ for (var i = 1; i <= 20; i++) {
$("#defaultzoom").append(new Option(i, i));
}
}

271 changes: 130 additions & 141 deletions CrmGoogleMaps/js/googleMaps.js
Original file line number Diff line number Diff line change
@@ -1,162 +1,116 @@
var useGoogleAddress = false;
var markerIcon = "";
var defaultZoom = null;
var map;
var addresses = [];
var addressProcessedCounter = 0;
var lat = [];
var lng = [];
var markers = [];

function RefreshButton(topLeftDiv) {
var imageUI = document.createElement('img');
imageUI.style.height = '20px';
imageUI.style.width = '20px';
imageUI.src = '../img/refresh.svg';
imageUI.style.backgroundColor = '#fff';
imageUI.style.border = '2px solid #fff';
imageUI.style.borderRadius = '3px';
imageUI.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)';
imageUI.style.cursor = 'pointer';
topLeftDiv.appendChild(imageUI);

topLeftDiv.addEventListener('click', function () {
initialize();
});
}

function initialize() {
var p = GetParameters();
var map_canvas = document.getElementById('map_canvas');
var map_options = {
mapTypeId: google.maps.MapTypeId.ROADMAP,
mapTypeControl: false
}
map = map || new google.maps.Map(map_canvas, map_options);

var topLeftControl = document.createElement('div');
topLeftControl.style.margin = '10px 14px';
var centerControl = new RefreshButton(topLeftControl);

topLeftControl.index = 1;
if (map.controls[google.maps.ControlPosition.TOP_LEFT].length == 0) {
map.controls[google.maps.ControlPosition.TOP_LEFT].push(topLeftControl);
}

for (var i = 0; i < markers.length; i++) {
markers[i].setMap(null);
}
addressProcessedCounter = 0;
lat = [];
lng = [];
markers = [];
addresses = p.address.split(',');
if (p.zoom != undefined) { defaultZoom = parseInt(p.zoom); }
$.each(addresses, function (index, value) {
var addressString = generateAddressString(value);
setMarker(addressString)
});

}

function generateAddressString(field) {
var addressString = [];
if (field.indexOf('+') !== -1) {
var fields = field.split('+');
$.each(fields, function (index, value) {
var fieldValue = window.parent.Xrm.Page.data.entity.attributes.get(value).getValue();
if (fieldValue != null) {
addressString.push(fieldValue);
function getStoredApiKey() {
var req = new XMLHttpRequest();
req.open("GET",
Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations?$select=fic_apikey,fic_usegoogleaddress,fic_markericon,fic_defaultzoom",
true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 200) {
var results = JSON.parse(this.response);
if (results.value.length == 0) {
return;
} else {
var configId = results.value[0]["fic_apikey"];
$('#apikey').val(configId);
var markerIcon = results.value[0]["fic_markericon"];
$('#markerIcon').val(markerIcon);
var useGoogleAddresses = results.value[0]["fic_usegoogleaddress"];
var defaultZoom = results.value[0]["fic_defaultzoom"];
$('#defaultzoom').val(defaultZoom);
$('#useGoogleAddresses').prop('checked', useGoogleAddresses);
}
} else {
Xrm.Utility.alertDialog(this.statusText);
}
});
return addressString.join();
} else {
return window.parent.Xrm.Page.data.entity.attributes.get(field).getValue();;
}
}
};
req.send();
}

function setCenterAndZoom() {
map.setCenter(new google.maps.LatLng(
((Math.max.apply(Math, lat) + Math.min.apply(Math, lat)) / 2.0), ((Math.max.apply(Math, lng) + Math.min.apply(Math, lng)) / 2.0)));
if (markers.length == 1) {
map.setZoom(defaultZoom);
} else {
map.fitBounds(new google.maps.LatLngBounds(
//bottom left
new google.maps.LatLng(Math.min.apply(Math, lat), Math.min.apply(Math, lng)),
//top right
new google.maps.LatLng(Math.max.apply(Math, lat), Math.max.apply(Math, lng))));
}
function createKey(apiKey) {
var entity = {};
entity.fic_apikey = apiKey;
entity.fic_usegoogleaddress = $('#useGoogleAddresses').prop('checked');
entity.fic_markericon = $('#markerIcon').val();
entity.fic_defaultzoom = $('#defaultzoom').val();
var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204) {
$(".alert").text("Settings have been created successfuly!");
$(".alert").show();
setTimeout(function () {
$(".alert").hide();
}, 3000);
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send(JSON.stringify(entity));
}

function setMarker(address) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
'address': address
},

function (results, status) {
addressProcessedCounter++;
if (status == google.maps.GeocoderStatus.OK) {
lat.push(results[0].geometry.location.lat());
lng.push(results[0].geometry.location.lng());

var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
title: useGoogleAddress ? results[0].formatted_address : address,
icon: markerIcon
});
markers.push(marker);
google.maps.event.addListener(marker,
'click',
function () {
var infowindow = new google.maps.InfoWindow({
content: marker.title,
position: marker.position,
});
infowindow.open(map);
});
} else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
function updateKey(key, id) {
var entity = {};
entity.fic_apikey = key;
entity.fic_usegoogleaddress = $('#useGoogleAddresses').prop('checked');
entity.fic_markericon = $('#markerIcon').val();
entity.fic_defaultzoom = $('#defaultzoom').val();
var req = new XMLHttpRequest();
req.open("PATCH",
Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations(" + id + ")",
true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204) {
$(".alert").text("Settings have been updated successfuly!");
$(".alert").show();
setTimeout(function () {
$(".alert").hide();
}, 3000);
} else {
console.log("Geocode was not successful for the following reason: " + status);
}
if (addressProcessedCounter == addresses.length) {
if (markers.length != 0) {
$("#map_canvas").show();
setCenterAndZoom(map);
} else {
$("#no_results").show();
}
Xrm.Utility.alertDialog(this.statusText);
}
});
}
};
req.send(JSON.stringify(entity));
}

function loadScript() {
function upsertKey(key) {
var req = new XMLHttpRequest();
req.open("GET",
Xrm.Page.context.getClientUrl() + "/api/data/v8.2/fic_googlemapsconfigurations?$select=fic_apikey,fic_usegoogleaddress,fic_markericon,fic_defaultzoom",
true);
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v" + VERSION + "/fic_googlemapsconfigurations", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 200) {
var results = JSON.parse(this.response);
if (results.value.length == 0) return;
var apiKey = results.value[0]["fic_apikey"];
useGoogleAddress = results.value[0]["fic_usegoogleaddress"];
markerIcon = results.value[0]["fic_markericon"];
defaultZoom = results.value[0]["fic_defaultzoom"];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://maps.googleapis.com/maps/api/js?key=' + apiKey;
script.onload = initialize;
document.body.appendChild(script);
if (results.value.length == 0) {
createKey(key);
} else {
var configId = results.value[0]["fic_googlemapsconfigurationid"].replace("{", "").replace("}", "");
updateKey(key, configId);
}
} else {
Xrm.Utility.alertDialog(this.statusText);
}
Expand All @@ -165,4 +119,39 @@ function loadScript() {
req.send();
}

loadScript();
var VERSION = parent.Xrm.Page.context.getVersion() != "" ? parent.Xrm.Page.context.getVersion().substring(0, 3) : "8.0";
getStoredApiKey();
document.getElementById("update").addEventListener("click",
function () {
var key = document.getElementById('apikey').value;
upsertKey(key);
},
false);

$("#markerIcon").change(function () {
markerPreview = $('#markerIcon').val();
$("#markerPreview").attr("src", markerPreview);
$("#markerPreview").show();
});

for (var i = 1; i <= 20; i++) {
switch (i) {
case 1:
$("#defaultzoom").append(new Option(i + " (World)", i));
break;
case 5:
$("#defaultzoom").append(new Option(i + " (Continent)", i));
break;
case 10:
$("#defaultzoom").append(new Option(i + " (City)", i));
break;
case 15:
$("#defaultzoom").append(new Option(i + " (Street)", i));
break;
case 20:
$("#defaultzoom").append(new Option(i + " (Building)", i));
break;
default:
$("#defaultzoom").append(new Option(i, i));
}
}

0 comments on commit 25cdf40

Please sign in to comment.