diff options
| author | Indoteknik . <it@fixcomart.co.id> | 2025-06-10 15:47:32 +0700 |
|---|---|---|
| committer | Indoteknik . <it@fixcomart.co.id> | 2025-06-10 15:47:32 +0700 |
| commit | df0467f8e493840f3013bc58ca26fc6d98793c95 (patch) | |
| tree | 05a01e1dee6bf866caaecfb5651f849fcf37cf86 | |
| parent | 5ca33915f1e3d052cfa989163d43a15dbc9ddec9 (diff) | |
(andri) add openstreetmaps pada contact
| -rw-r--r-- | ab_openstreetmap/__init__.py | 0 | ||||
| -rw-r--r-- | ab_openstreetmap/__manifest__.py | 17 | ||||
| -rw-r--r-- | ab_openstreetmap/static/src/js/openstreetmap_widget.js | 86 | ||||
| -rw-r--r-- | ab_openstreetmap/static/src/xml/openstreetmap_template.xml | 8 | ||||
| -rw-r--r-- | ab_openstreetmap/views/templates.xml | 13 | ||||
| -rw-r--r-- | indoteknik_custom/models/res_partner.py | 26 | ||||
| -rw-r--r-- | indoteknik_custom/views/res_partner.xml | 19 |
7 files changed, 145 insertions, 24 deletions
diff --git a/ab_openstreetmap/__init__.py b/ab_openstreetmap/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/ab_openstreetmap/__init__.py diff --git a/ab_openstreetmap/__manifest__.py b/ab_openstreetmap/__manifest__.py new file mode 100644 index 00000000..745e57ab --- /dev/null +++ b/ab_openstreetmap/__manifest__.py @@ -0,0 +1,17 @@ +{ + 'name': "Openstreetmap Widget", + 'summary': """ + Openstreetmap Widget + """, + 'description': """ + Show Openstreetmap in Form View + Required for works add a lat long field to the model + """, + 'author': "PT. ISMATA NUSANTARA ABADI", + 'website': "http://www.ismata.co.id", + 'category': 'Uncategorized', + 'version': '0.1', + 'depends': ['base'], + "qweb": ['static/src/xml/openstreetmap_template.xml'], + 'data': ['views/templates.xml'], +} diff --git a/ab_openstreetmap/static/src/js/openstreetmap_widget.js b/ab_openstreetmap/static/src/js/openstreetmap_widget.js new file mode 100644 index 00000000..42760d2d --- /dev/null +++ b/ab_openstreetmap/static/src/js/openstreetmap_widget.js @@ -0,0 +1,86 @@ +odoo.define("ab_openstreetmap.openstreetmap_widget", function (require) { + "use strict"; + var fieldRegistry = require("web.field_registry"); + var abstractField = require("web.AbstractField"); + + var openstreetmap = abstractField.extend({ + template: "openstreetmap_template", + start: function () { + var self = this; + this._super(); + self._initMap(); + }, + _initMap: function () { + var self = this + $(document).ready(function () { + setTimeout(() => { + var lat = self.recordData.lat; + var lng = self.recordData.lng; + + if (!lat && !lng) { + lat = -6.2349; + lng = 106.9896; + } + + var mymap = L.map('mapid').setView([lat, lng], 13); + L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { + attribution: + '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', + }).addTo(mymap); + + var edit = self.mode == "edit" ? true : false; + var marker = L.marker([lat, lng], { draggable: edit }).addTo(mymap); + + marker.on("dragend", function (e) { + var latlng = e.target._latlng; + self.trigger_up("field_changed", { + dataPointID: self.dataPointID, + changes: { + lat: latlng.lat, + lng: latlng.lng, + }, + viewType: self.viewType, + }); + }); + + if (edit) { + var geocode = L.Control.geocoder({ + defaultMarkGeocode: false, + }).addTo(mymap); + + geocode.on("markgeocode", function (e) { + var lat = e.geocode.center.lat; + var lng = e.geocode.center.lng; + + mymap.flyTo([lat, lng]); + marker.setLatLng(new L.LatLng(lat, lng)); + self.trigger_up("field_changed", { + dataPointID: self.dataPointID, + changes: { + lat: lat, + lng: lng, + }, + viewType: self.viewType, + }); + }); + } + + var interval = setInterval(() => { + if (mymap && mymap._size.x > 0){ + clearInterval(interval); + } else if (!document.getElementById("mapid")) { + clearInterval(interval); + } + window.dispatchEvent(new Event("resize")); + }, 500); + }, 100); + + }); + }, + isSet: function () { + return true; + }, + }); + + fieldRegistry.add("openstreetmap", openstreetmap); +}); diff --git a/ab_openstreetmap/static/src/xml/openstreetmap_template.xml b/ab_openstreetmap/static/src/xml/openstreetmap_template.xml new file mode 100644 index 00000000..82672748 --- /dev/null +++ b/ab_openstreetmap/static/src/xml/openstreetmap_template.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<templates id="template" xml:space="preserve"> + <t t-name="openstreetmap_template"> + <div style="width:100%"> + <div id="mapid" style="height: 500px;"/> + </div> + </t> +</templates>
\ No newline at end of file diff --git a/ab_openstreetmap/views/templates.xml b/ab_openstreetmap/views/templates.xml new file mode 100644 index 00000000..ed82ae84 --- /dev/null +++ b/ab_openstreetmap/views/templates.xml @@ -0,0 +1,13 @@ +<odoo> + <data> + <template id="assets_backend" inherit_id="web.assets_backend"> + <xpath expr="." position="inside"> + <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==" crossorigin=""/> + <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js" integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==" crossorigin=""></script> + <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" /> + <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script> + <script type="text/javascript" src="/ab_openstreetmap/static/src/js/openstreetmap_widget.js"/> + </xpath> + </template> + </data> +</odoo>
\ No newline at end of file diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 0f1edac2..fee0e73b 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -146,6 +146,7 @@ class ResPartner(models.Model): date_payment_terms_purchase = fields.Datetime(string='Date Update Payment Terms') longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') + map_view = fields.Char(string='Map') address_map = fields.Char(string='Address Map') company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], @@ -526,12 +527,24 @@ class ResPartner(models.Model): def geocode_address(self): for rec in self: + # Ambil nama dari relasi (Many2one) atau gunakan nilai default + kelurahan = rec.kelurahan_id.name if rec.kelurahan_id else '' + kecamatan = rec.kecamatan_id.name if rec.kecamatan_id else '' + kota = rec.kota_id.name if rec.kota_id else '' + zip_code = rec.zip or '' + state = rec.state_id.name if rec.state_id else '' + country = rec.country_id.name if rec.country_id else '' + street = rec.street or '' + + # Susun alamat lengkap sesuai urutan lokal address = ', '.join(filter(None, [ - rec.street, - rec.city, - rec.state_id.name if rec.state_id else '', - rec.zip, - rec.country_id.name if rec.country_id else '' + street, + kelurahan, + kecamatan, + kota, + zip_code, + state, + country, ])) if not address: @@ -539,6 +552,7 @@ class ResPartner(models.Model): api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' + response = requests.get(url) if response.ok: @@ -546,4 +560,4 @@ class ResPartner(models.Model): if result.get('results'): location = result['results'][0]['geometry']['location'] rec.latitude = location['lat'] - rec.longtitude = location['lng']
\ No newline at end of file + rec.longtitude = location['lng'] diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml index f4c1be31..c23500c8 100644 --- a/indoteknik_custom/views/res_partner.xml +++ b/indoteknik_custom/views/res_partner.xml @@ -70,24 +70,7 @@ <field name="longtitude"/> <button name="geocode_address" type="object" string="Cari Lokasi dari Alamat" class="btn btn-primary"/> - - <separator string="Map Lokasi"/> - <div style="height: 400px;"> - <t t-if="record.latitude.value and record.longtitude.value"> - <t t-set="google_maps_api_key" t-value="request.env['ir.config_parameter'].sudo().get_param('google.maps.api_key')"/> - <iframe - t-att-src="'https://www.google.com/maps/embed/v1/place?key=' + google_maps_api_key + '&q=' + str(record.latitude.value) + ',' + str(record.longtitude.value)" - width="100%" - height="400" - style="border:0;" - allowfullscreen="" - loading="lazy" - ></iframe> - </t> - <t t-else=""> - <p>Isi alamat lalu klik "Cari Lokasi dari Alamat" untuk menampilkan peta.</p> - </t> - </div> + <field name="map_view" widget="openstreetmap"/> </field> <field name="vat" position="after"> <field name="email_finance" widget="email"/> |
