diff --git a/README.md b/README.md index 5f4904f2e..42f94a621 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Available addons addon | version | maintainers | summary --- | --- | --- | --- [base_google_map](base_google_map/) | 19.0.1.0.0 | gityopie wolfhall | View modes and widgets to integrate Google Maps in your UI -[web_view_google_map](web_view_google_map/) | 19.0.1.0.0 | gityopie wolfhall | Add a Google Map view type to the Odoo web client +[web_view_google_map](web_view_google_map/) | 19.0.1.0.2 | gityopie wolfhall | Add a Google Map view type to the Odoo web client [//]: # (end addons) diff --git a/web_view_google_map/README.rst b/web_view_google_map/README.rst index 0d2480621..0cac0cce4 100644 --- a/web_view_google_map/README.rst +++ b/web_view_google_map/README.rst @@ -11,7 +11,7 @@ Google Map View !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e3204ed739e2c2f17e8303da58167c42e5549fe7c6e2ac0959fb3fdac82bb9a1 + !! source digest: sha256:247a050c0bbf71a4ea225999772a9e018f353b64e164a16e90c6371051440788 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/web_view_google_map/__manifest__.py b/web_view_google_map/__manifest__.py index f1f6719fc..04861e3a9 100644 --- a/web_view_google_map/__manifest__.py +++ b/web_view_google_map/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Google Map View", "summary": "Add a Google Map view type to the Odoo web client", - "version": "19.0.1.0.0", + "version": "19.0.1.0.2", "author": "Open Source Integrators, Gray Matter Logic, " "Odoo Community Association (OCA)", "website": "https://github.com/OCA/geospatial", diff --git a/web_view_google_map/i18n/web_view_google_map.pot b/web_view_google_map/i18n/web_view_google_map.pot index 712de28de..ced2abcb1 100644 --- a/web_view_google_map/i18n/web_view_google_map.pot +++ b/web_view_google_map/i18n/web_view_google_map.pot @@ -18,6 +18,12 @@ msgstr "" msgid "Action Window View" msgstr "" +#. module: web_view_google_map +#. odoo-javascript +#: code:addons/web_view_google_map/static/src/views/google_map/google_map_renderer.xml:0 +msgid "Configure API key" +msgstr "" + #. module: web_view_google_map #: model:ir.model.fields,field_description:web_view_google_map.field_ir_actions_act_window_view__display_name #: model:ir.model.fields,field_description:web_view_google_map.field_ir_ui_view__display_name @@ -35,6 +41,12 @@ msgstr "" msgid "Google Maps" msgstr "" +#. module: web_view_google_map +#. odoo-javascript +#: code:addons/web_view_google_map/static/src/views/google_map/google_map_renderer.xml:0 +msgid "Google Maps API key required" +msgstr "" + #. module: web_view_google_map #. odoo-javascript #: code:addons/web_view_google_map/static/src/fields/gplaces_address_form.esm.js:0 @@ -59,6 +71,15 @@ msgstr "" msgid "New" msgstr "" +#. module: web_view_google_map +#. odoo-javascript +#: code:addons/web_view_google_map/static/src/views/google_map/google_map_renderer.xml:0 +msgid "" +"Set a valid Google Maps API key to display this map.\n" +" Enable the Maps JavaScript API for your key in Google Cloud\n" +" Console." +msgstr "" + #. module: web_view_google_map #: model:ir.model,name:web_view_google_map.model_ir_ui_view msgid "View" diff --git a/web_view_google_map/static/description/index.html b/web_view_google_map/static/description/index.html index cc9238ae1..4bd1fa590 100644 --- a/web_view_google_map/static/description/index.html +++ b/web_view_google_map/static/description/index.html @@ -372,7 +372,7 @@

Google Map View

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:e3204ed739e2c2f17e8303da58167c42e5549fe7c6e2ac0959fb3fdac82bb9a1 +!! source digest: sha256:247a050c0bbf71a4ea225999772a9e018f353b64e164a16e90c6371051440788 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/geospatial Translate me on Weblate Try me on Runboat

This module adds a Google Maps view type and Places autocomplete field diff --git a/web_view_google_map/static/src/views/google_map/google_map_renderer.esm.js b/web_view_google_map/static/src/views/google_map/google_map_renderer.esm.js index 03ddd1d90..dd0988833 100644 --- a/web_view_google_map/static/src/views/google_map/google_map_renderer.esm.js +++ b/web_view_google_map/static/src/views/google_map/google_map_renderer.esm.js @@ -65,6 +65,7 @@ export class GoogleMapRenderer extends Component { this.infoWindow = null; this.records = []; this.theme = "default"; + this.missingApiKey = false; const archEl = normalizeArch(this.props.archInfo?.arch || this.props.arch); const attrs = archEl.attributes || {}; @@ -80,12 +81,19 @@ export class GoogleMapRenderer extends Component { ); onWillStart(async () => { - await loadGoogleMaps(this.orm); + const maps = await loadGoogleMaps(this.orm); + if (!maps) { + this.missingApiKey = true; + return; + } await this.loadTheme(); await this.loadRecords(); }); onMounted(() => { + if (this.missingApiKey) { + return; + } this.initMap(); this.renderMarkers(); }); @@ -97,6 +105,16 @@ export class GoogleMapRenderer extends Component { }); } + openGoogleMapsSettings() { + this.action.doAction({ + type: "ir.actions.act_window", + res_model: "res.config.settings", + views: [[false, "form"]], + target: "current", + context: {module: "base_google_map"}, + }); + } + async loadTheme() { try { const data = await rpc("/web/map_theme"); diff --git a/web_view_google_map/static/src/views/google_map/google_map_renderer.scss b/web_view_google_map/static/src/views/google_map/google_map_renderer.scss index 717ac77fc..eda0e4d76 100644 --- a/web_view_google_map/static/src/views/google_map/google_map_renderer.scss +++ b/web_view_google_map/static/src/views/google_map/google_map_renderer.scss @@ -17,3 +17,12 @@ margin-bottom: 0.25rem; } } + +.o_google_map_missing_key { + display: flex; + align-items: center; + justify-content: center; + min-height: 400px; + height: 100%; + text-align: center; +} diff --git a/web_view_google_map/static/src/views/google_map/google_map_renderer.xml b/web_view_google_map/static/src/views/google_map/google_map_renderer.xml index 106d9b474..6ae88c5cf 100644 --- a/web_view_google_map/static/src/views/google_map/google_map_renderer.xml +++ b/web_view_google_map/static/src/views/google_map/google_map_renderer.xml @@ -2,7 +2,26 @@

-
+
+
+

+ Google Maps API key required +

+

+ Set a valid Google Maps API key to display this map. + Enable the Maps JavaScript API for your key in Google Cloud + Console. +

+ +
+
+
diff --git a/web_view_google_map/static/src/views/google_map/google_maps_loader.esm.js b/web_view_google_map/static/src/views/google_map/google_maps_loader.esm.js index bc18fa1fc..0023d25d1 100644 --- a/web_view_google_map/static/src/views/google_map/google_maps_loader.esm.js +++ b/web_view_google_map/static/src/views/google_map/google_maps_loader.esm.js @@ -2,11 +2,22 @@ import {loadJS} from "@web/core/assets"; let googleMapsPromise = null; +/** Demo / unset values that must not be sent to Google. */ +const UNUSABLE_API_KEYS = new Set(["", "YOUR_GOOGLE_MAPS_API_KEY"]); + +/** + * @param {String|false|null|undefined} apiKey + * @returns {Boolean} + */ +export function isUsableGoogleMapsApiKey(apiKey) { + return !UNUSABLE_API_KEYS.has(String(apiKey || "").trim()); +} + /** * Load the Google Maps JS API using keys/libraries from ir.config_parameter. * Parameters are managed by base_google_map. * @param {Object} orm - ORM service (`useService("orm")`) - * @returns {Promise} + * @returns {Promise} maps API, or null if no usable key */ export async function loadGoogleMaps(orm) { if (window.google?.maps) { @@ -35,15 +46,17 @@ export async function loadGoogleMaps(orm) { ]), ]); + if (!isUsableGoogleMapsApiKey(apiKey)) { + return null; + } + const url = new URL("https://maps.googleapis.com/maps/api/js"); url.searchParams.set("v", "quarterly"); url.searchParams.set( "libraries", String(libraries || "geometry,places").replace(/^,+|,+$/g, "") ); - if (apiKey) { - url.searchParams.set("key", apiKey); - } + url.searchParams.set("key", String(apiKey).trim()); // Lang/region may already include "&language=xx" from base_google_map const langCode = String(lang || "").includes("=") ? String(lang).split("=").pop()