Author: |
Odoo Engineering |
License: |
AGPL-3 |
Branch: |
13.0 |
Repository: |
Andyeyo/Odoo-Addons |
Dependencies: |
base,
base_geolocalize,
base_setup,
contacts,
and
web |
Languages: |
HTML (86, 2.3%),
JavaScript (2761, 73.5%),
Markdown (262, 7.0%),
Python (255, 6.8%),
Sass (125, 3.3%),
and
XML (269, 7.2%) |
Other branches: |
15.0 |
<h1>Web Google Maps</h1>
<p><a href="https://youtu.be/5hvAubXgUnc" title="Demo"><img src="https://i.ytimg.com/vi/2UdG5ILDtiY/3.jpg" alt="Demo"></a> </p>
<p>This module contains three new features:
- New view type and mode <code>"map"</code>
- New widget <code>"gplaces_address_autocomplete"</code>
- New widget <code>"gplaces_autocomplete"</code></p>
<h1>Map view <code>"map"</code></h1>
<p>Basically, this new view <code>map</code> will integrate Google Maps into Odoo.<br>
Enable you to display <code>res.partner</code> geolocation on map or any model contains geolocation.<br>
This feature will work seamlessly with Odoo means you can search your partner location using Odoo search feature. </p>
<p>There are five available attributes that you can customize
- <code>lat</code> : an attritube to tell the map the latitude field on the object <strong>[mandatory]</strong>
- <code>lng</code> : an attritute to tell the map the longitude field on the object <strong>[mandatory]</strong>
- <code>color</code> : an attribute to modify marker color (optional) any given color will set all markers color <strong>[optional]</strong>.
- <code>colors</code> : work like attribute <code>color</code> but more configurable (you can set marker color depends on it's value) this attribute works similar to <code>colors</code> of tree view on Odoo 9.0 <strong>[optional]</strong>
- <code>library</code> : an attribute to tell map which map that will be loaded <strong>[mandatory]</strong>.<br>
This options has two values:<br>
1. <code>geometry</code>
2. <code>drawing</code></p>
<h3>How to create the view?</h3>
<p>Example
```xml
<!-- View -->
<record id="view_res_partner_map" model="ir.ui.view">
<field name="name">view.res.partner.map</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<map class="o_res_partner_map" library='geometry' string="Map" lat="partner_latitude" lng="partner_longitude" colors="blue:company_type=='person';green:company_type=='company';">
<field name="id"/>
<field name="partner_latitude"/>
<field name="partner_longitude"/>
<field name="company_type"/>
<field name="color"/>
<field name="display_name"/>
<field name="title"/>
<field name="email"/>
<field name="parent_id"/>
<field name="is_company"/>
<field name="function"/>
<field name="phone"/>
<field name="street"/>
<field name="street2"/>
<field name="zip"/>
<field name="city"/>
<field name="country_id"/>
<field name="mobile"/>
<field name="state_id"/>
<field name="category_id"/>
<field name="image_small"/>
<field name="type"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click o_res_partner_kanban">
<div class="o_kanban_image">
<t t-if="record.image_small.raw_value">
<img t-att-src="kanban_image('res.partner', 'image_small', record.id.raw_value)"/>
</t>
<t t-if="!record.image_small.raw_value">
<t t-if="record.type.raw_value === 'delivery'">
<img t-att-src='_s + "/base/static/src/img/truck.png"' class="o_kanban_image oe_kanban_avatar_smallbox"/>
</t>
<t t-if="record.type.raw_value === 'invoice'">
<img t-att-src='_s + "/base/static/src/img/money.png"' class="o_kanban_image oe_kanban_avatar_smallbox"/>
</t>
<t t-if="record.type.raw_value != 'invoice' && record.type.raw_value != 'delivery'">
<t t-if="record.is_company.raw_value === true">
<img t-att-src='_s + "/base/static/src/img/company_image.png"'/>
</t>
<t t-if="record.is_company.raw_value === false">
<img t-att-src='_s + "/base/static/src/img/avatar.png"'/>
</t>
</t>
</t>
</div>
<div class="oe_kanban_details">
<strong class="o_kanban_record_title oe_partner_heading">
<field name="display_name"/>
</strong>
<div class="o_kanban_tags_section oe_kanban_partner_categories">
<span class="oe_kanban_list_many2many">
<field name="category_id" widget="many2many_tags" options="{'color_field': 'color'}"/>
</span>
</div>
<ul>
<li t-if="record.parent_id.raw_value and !record.function.raw_value">
<field name="parent_id"/>
</li>
<li t-if="!record.parent_id.raw_value and record.function.raw_value">
<field name="function"/>
</li>
<li t-if="record.parent_id.raw_value and record.function.raw_value">
<field name="function"/> at <field name="parent_id"/>
</li>
<li t-if="record.city.raw_value and !record.country_id.raw_value">
<field name="city"/>
</li>
<li t-if="!record.city.raw_value and record.country_id.raw_value">
<field name="country_id"/>
</li>
<li t-if="record.city.raw_value and record.country_id.raw_value">
<field name="city"/>
, <field name="country_id"/>
</li>
<li t-if="record.email.raw_value" class="o_text_overflow">
<field name="email"/>
</li>
</ul>
<div class="oe_kanban_partner_links"/>
</div>
</div>
</t>
</templates>
</map>
</field>
</record></p>
<pre><code><!-- Action -->
<record id="action_partner_map" model="ir.actions.act_window">
...
<field name="view_type">form</field>
<field name="view_mode">tree,form,map</field>
...
</record>
</code></pre>
<p>```</p>
<p>The view looks familiar?<br>
Yes, you're right.<br>
The marker infowindow will use <code>kanban-box</code> kanban card style. </p>
<h3>How to setup color for marker on map?</h3>
<p>There are two attributes:
- <code>colors</code><br>
Allow you to display different marker color to represent a record on map
- <code>color</code><br>
One marker color for all records on map</p>
<p>Example:
```xml
<!-- colors -->
<map string="Map" lat="partner_latitude" lng="partner_longitude" colors="green:company_type=='person';blue:company_type=='company';">
...
</map></p>
<pre><code><!-- color -->
<map string="Map" lat="partner_latitude" lng="partner_longitude" color="orange">
...
</map>
</code></pre>
<p>```</p>
<h1>New widget <code>"gplaces_address_autocomplete"</code></h1>
<p>New widget to integrate <a href="https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform">Place Autocomplete Address Form</a> in Odoo.<br>
The widget has four options that can be modify:
- <code>component_form</code>
- <code>fillfields</code>
- <code>lat</code>
- <code>lng</code></p>
<h3>Component form <code>component_form</code></h3>
<p>Is an option used to modify which value you want to take from an objects returned by the geocoder.<br>
Full documentation about Google component types can be found <a href="https://developers.google.com/maps/documentation/geocoding/intro#Types">here</a>
By default this option are configured like the following value
<code>javascript
{
'street_number': 'long_name',
'route': 'long_name',
'intersection': 'short_name',
'political': 'short_name',
'country': 'short_name',
'administrative_area_level_1': 'short_name',
'administrative_area_level_2': 'short_name',
'administrative_area_level_3': 'short_name',
'administrative_area_level_4': 'short_name',
'administrative_area_level_5': 'short_name',
'colloquial_area': 'short_name',
'locality': 'short_name',
'ward': 'short_name',
'sublocality_level_1': 'short_name',
'sublocality_level_2': 'short_name',
'sublocality_level_3': 'short_name',
'sublocality_level_5': 'short_name',
'neighborhood': 'short_name',
'premise': 'short_name',
'postal_code': 'short_name',
'natural_feature': 'short_name',
'airport': 'short_name',
'park': 'short_name',
'point_of_interest': 'long_name'
}
</code>
This configuration can be modify into view field definition.<br>
Example:
<code>xml
<record id="view_res_partner_form" model="ir.ui.view">
...
<field name="arch" type="xml">
...
<field name="street" widget="gplaces_address_form" options="{'component_form': {'street_number': 'short_name'}}"/>
...
</field>
</record>
</code></p>
<h3>Fill fields <code>fillfields</code></h3>
<p>Is an option that will be influenced by <code>gplaces_address_autocomplete</code> widget.<br>
This options should contains known <code>fields</code> that you want the widget to fulfill a value for each given field automatically.<br>
A field can contains one or multiple elements of component form<br>
By default this options are configured like the following
<code>javascript
{
'street': ['street_number', 'route'],
'street2': ['administrative_area_level_3', 'administrative_area_level_4', 'administrative_area_level_5'],
'city': ['locality', 'administrative_area_level_2'],
'zip': 'postal_code',
'state_id': 'administrative_area_level_1',
'country_id': 'country',
}
</code></p>
<p>This configuration can be modify into view field definition as well<br>
Example:
<code>xml
<record id="view_res_partner_form" model="ir.ui.view">
...
<field name="arch" type="xml">
...
<field name="street" widget="google_places" options="{'fillfields': {'street2': ['route', 'street_number']}}"/>
...
</field>
</record>
</code></p>
<h3>Latitude <code>lat</code> and Longitude <code>lng</code></h3>
<p>This options tell the widget the fields geolocation, in order to have this fields filled automatically.</p>
<h1>New widget <code>"gplaces_autocomplete"</code></h1>
<p>New widget to integrate <a href="https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete">Place Autocomplete</a> in Odoo.
This widget have similar configuration to <code>gplaces_address_autocomplete</code>.</p>
<h3>Component form <code>component_form</code></h3>
<p>Same configuration of <code>gplaces_address_autocomplete</code> component form</p>
<h3>Fill fields <code>fillfields</code></h3>
<p>This configuration works similar to <code>gplaces_address_autocomplete</code>.
By default this options are configured like following value:
<code>javascript
{
general: {
name: 'name',
website: 'website',
phone: ['international_phone_number', 'formatted_phone_number']
},
geolocation: {
partner_latitude: 'latitude',
partner_longitude: 'longitude'
},
address: {
street: ['street_number', 'route'],
street2: ['administrative_area_level_3', 'administrative_area_level_4', 'administrative_area_level_5'],
city: ['locality', 'administrative_area_level_2'],
zip: 'postal_code',
state_id: 'administrative_area_level_1',
country_id: 'country'
}
};
</code></p>
<h1>Technical</h1>
<p>This module will install <code>base_setup</code> and <code>base_geolocalize</code>.<br>
<em>I recommend you to setup <strong>Google Maps Key API</strong> and add it into Odoo <code>Settings > General</code> Settings when you installed this module</em></p>
<p><em><strong>List of Google APIs & services required in order to make all features works</strong></em>
- Geocoding API
- Maps JavaScript API
- Places API</p>
<p>Visit this <a href="https://developers.google.com/maps/documentation/javascript/get-api-key">page</a> of how to get Google API Key</p>
<p><a href="https://ko-fi.com/P5P4FOM0"><img src="https://www.ko-fi.com/img/donate_sm.png" alt="ko-fi"></a><br>
<em>if you want to support me to keep this project maintained. Thanks :)</em></p>