289 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Markdown
		
	
	
| Web Google Maps
 | |
| ===============   
 | |
| 
 | |
| [](https://youtu.be/5hvAubXgUnc "Demo")    
 | |
| 
 | |
| 
 | |
| This module contains three new features:
 | |
|  - New view type and mode `map`
 | |
|  - New widget `gplaces_address_autocomplete`
 | |
|  - New widget `gplaces_autocomplete`
 | |
|  
 | |
| 
 | |
| # Map view  `"map"`
 | |
| Basically, this new view `map`  will integrate Google Maps into Odoo.    
 | |
| Enable you to display `res.partner` geolocation on map or any model contains geolocation.   
 | |
| This feature will work seamlessly with Odoo means you can search your partner location using Odoo search feature.     
 | |
| 
 | |
| There are five available attributes that you can customize
 | |
|  - `lat` : an attritube to tell the map the latitude field on the object __[mandatory]__
 | |
|  - `lng` : an attritute to tell the map the longitude field on the object __[mandatory]__
 | |
|  - `color` : an attribute to modify marker color (optional) any given color will set all markers color __[optional]__.
 | |
|  - `colors` : work like attribute `color` but more configurable (you can set marker color depends on it's value) this attribute works similar to `colors` of tree view on Odoo 9.0 __[optional]__
 | |
|  - `library` : an attribute to tell map which map that will be loaded __[mandatory]__.    
 | |
|     This options has two values:   
 | |
|     1. `geometry`
 | |
|     2. `drawing`
 | |
|  
 | |
| How to create the view?    
 | |
| Example
 | |
| >
 | |
|     <!-- 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>
 | |
|     
 | |
|     <!-- 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>
 | |
| 
 | |
| 
 | |
| The view looks familiar?    
 | |
| Yes, you're right.    
 | |
| The marker infowindow will use `kanban-box` kanban card style.    
 | |
| 
 | |
| 
 | |
| ### How to setup color for marker on map?
 | |
| There are two attributes:
 | |
|  - `colors` 
 | |
|  - `color` 
 | |
| 
 | |
| Example:
 | |
| > 
 | |
| 	<!-- colors -->
 | |
|     <map string="Map" lat="partner_latitude" lng="partner_longitude" colors="green:company_type=='person';blue:company_type=='company';">
 | |
|         ...
 | |
|     </map>
 | |
| 
 | |
|     <!-- color -->
 | |
|     <map string="Map" lat="partner_latitude" lng="partner_longitude" color="orange">
 | |
|         ...
 | |
|     </map>
 | |
| 
 | |
| 
 | |
| # New widget `"gplaces_address_autocomplete"`
 | |
| 
 | |
| New widget to integrate [Place Autocomplete Address Form](https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform) in Odoo.  
 | |
| The widget has four options that can be modify:
 | |
|  - `component_form`
 | |
|  - `fillfields`
 | |
|  - `lat`
 | |
|  - `lng`
 | |
| 
 | |
| ### Component form `component_form`
 | |
| Is an option used to modify which value you want to take from an objects returned by the geocoder.    
 | |
| Full documentation about Google component types can be found [here](https://developers.google.com/maps/documentation/geocoding/intro#Types)
 | |
| By default this option are configured like the following value
 | |
| >
 | |
|     {
 | |
|         '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'
 | |
|     }
 | |
| 
 | |
| This configuration can be modify into view field definition.    
 | |
| Example:
 | |
| > 
 | |
|     <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>
 | |
| 
 | |
| 
 | |
| ### Fill fields `fillfields`
 | |
| Is an option that will be influenced by `gplaces_address_autocomplete` widget.    
 | |
| This options should contains known `fields` that you want the widget to fulfill a value for each given field automatically.    
 | |
| A field can contains one or multiple elements of component form    
 | |
| By default this options are configured like the following
 | |
| >
 | |
|     {
 | |
|         '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',
 | |
|     }
 | |
| 
 | |
|         
 | |
| This configuration can be modify into view field definition as well    
 | |
| Example:
 | |
| >
 | |
|     <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>
 | |
| 
 | |
| ### Latitude `lat` and Longitude `lng`
 | |
| This options tell the widget the fields geolocation, in order to have this fields filled automatically.
 | |
| 
 | |
| 
 | |
| # New widget `"gplaces_autocomplete"`
 | |
| 
 | |
| New widget to integrate [Place Autocomplete](https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete) in Odoo.
 | |
| This widget have similar configuration to `gplaces_address_autocomplete`.
 | |
| 
 | |
| ### Component form `component_form` ###
 | |
| Same configuration of `gplaces_address_autocomplete` component form
 | |
| 
 | |
| ### Fill fields `fillfields`
 | |
| This configuration works similar to `gplaces_address_autocomplete`.
 | |
| By default this options are configured like following value:
 | |
| >
 | |
|     {
 | |
|         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'
 | |
|         }
 | |
|     };
 | |
| 
 | |
| # Technical
 | |
| This module will install `base_setup` and `base_geolocalize`.    
 | |
| *I recommend you to setup __Google Maps Key API__ and add it into Odoo `Settings > General` Settings when you installed this module*
 | |
| 
 | |
| *__List of Google APIs & services required in order to make all features works__*
 | |
| - Geocoding API
 | |
| - Maps JavaScript API
 | |
| - Places API for Web
 | |
| 
 | |
| 
 | |
| The goal of this module is to bring the power of Google Maps into Odoo    
 | |
| This module has tested on Odoo Version 11.0c    
 | |
| 
 | |
| [](https://ko-fi.com/P5P4FOM0)    
 | |
| *if you want to support me to keep this project maintained. Thanks :)* |