This repository has been archived on 2026-07-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
espocrm-base/client/src/views/fields/map.js
T
Taras Machyshyn fac5704c9e Added 2017 year
2017-01-17 15:07:08 +02:00

184 lines
6.0 KiB
JavaScript

/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('views/fields/map', 'views/fields/base', function (Dep) {
return Dep.extend({
type: 'map',
detailTemplate: 'fields/map/detail',
addressField: null,
provider: null,
height: 300,
data: function () {
var data = Dep.prototype.data.call(this);
return data;
},
setup: function () {
this.addressField = this.name.substr(0, this.name.length - 3);
this.provider = this.params.provider;
this.height = this.params.height || this.height;
var addressAttributeList = Object.keys(this.getMetadata().get('fields.address.fields') || {}).map(
function (a) {
return this.addressField + Espo.Utils.upperCaseFirst(a);
},
this
);
this.listenTo(this.model, 'sync', function (model) {
var isChanged = false;
addressAttributeList.forEach(function (attribute) {
if (model.hasChanged(attribute)) {
isChanged = true;
}
}, this);
if (isChanged && this.isRendered()) {
this.reRender();
}
}, this);
this.listenTo(this.model, 'after:save', function () {
if (this.isRendered()) {
this.reRender();
}
}, this);
},
hasAddress: function () {
return this.addressData.city || this.addressData.postalCode;
},
afterRender: function () {
this.addressData = {
city: this.model.get(this.addressField + 'City'),
street: this.model.get(this.addressField + 'Street'),
postalCode: this.model.get(this.addressField + 'PostalCode'),
country: this.model.get(this.addressField + 'Country'),
state: this.model.get(this.addressField + 'State')
};
if (this.hasAddress()) {
var methodName = 'afterRender' + this.provider.replace(/\s+/g, '');
if (typeof this[methodName] === 'function') {
this[methodName]();
}
}
},
afterRenderGoogle: function () {
if (window.google && window.google.maps) {
this.initMapGoogle();
} else {
window.mapapiloaded = function () {
this.initMapGoogle();
}.bind(this);
var src = 'https://maps.googleapis.com/maps/api/js?callback=mapapiloaded';
var apiKey = this.getConfig().get('googleMapsApiKey');
if (apiKey) {
src += '&key=' + apiKey;
}
var s = document.createElement('script');
s.setAttribute('async', 'async');
s.src = src;
document.head.appendChild(s);
}
},
initMapGoogle: function () {
this.$el.find('.map').css('height', this.height + 'px');
var geocoder = new google.maps.Geocoder();
try {
var map = new google.maps.Map(this.$el.find('.map').get(0), {
zoom: 15,
center: {lat: 0, lng: 0},
scrollwheel: false
});
} catch (e) {
console.error(e.message);
return;
}
var address = '';
if (this.addressData.street) {
address += this.addressData.street;
}
if (this.addressData.city) {
if (address != '') {
address += ', ';
}
address += this.addressData.city;
}
if (this.addressData.state) {
if (address != '') {
address += ', ';
}
address += this.addressData.state;
}
if (this.addressData.postalCode) {
if (this.addressData.state || this.addressData.city) {
address += ' ';
} else {
if (address) {
address += ', ';
}
}
address += this.addressData.postalCode;
}
if (this.addressData.country) {
if (address != '') {
address += ', ';
}
address += this.addressData.country;
}
geocoder.geocode({'address': address}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
}
}.bind(this));
}
});
});