diff --git a/base_geoengine/static/src/js/.eslintrc b/base_geoengine/static/src/js/.eslintrc
index dae1818bc..e74e6700b 100644
--- a/base_geoengine/static/src/js/.eslintrc
+++ b/base_geoengine/static/src/js/.eslintrc
@@ -1,9 +1,20 @@
{
- "globals": {
- "$": false,
- "_": false,
- "ol": false,
- "chroma": false,
- "geostats": false
- }
+ "globals": {
+ "$": false,
+ "_": false,
+ "ol": false,
+ "chroma": false,
+ "geostats": false
+ },
+ "plugins": [
+ "jsdoc"
+ ],
+ "rules": {
+ "jsdoc/check-tag-names": [
+ "warn",
+ {
+ "definedTags": ["odoo-module"]
+ }
+ ]
}
+}
diff --git a/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js b/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js
index cfc7c4642..0e73e3f91 100644
--- a/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js
+++ b/base_geoengine/static/src/js/views/geoengine/geoengine_arch_parser.esm.js
@@ -7,8 +7,8 @@
import {Field} from "@web/views/fields/field";
import {Widget} from "@web/views/widgets/widget";
import {_t} from "@web/core/l10n/translation";
-import {getActiveActions} from "@web/views/utils";
import {exprToBoolean} from "@web/core/utils/strings";
+import {getActiveActions} from "@web/views/utils";
import {visitXML} from "@web/core/utils/xml";
export const INFO_BOX_ATTRIBUTE = "info_box";
diff --git a/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js b/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js
index 1805e09ea..442f22189 100644
--- a/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js
+++ b/base_geoengine/static/src/js/views/geoengine/geoengine_controller/geoengine_controller.esm.js
@@ -6,6 +6,7 @@
*/
import {Component, useState} from "@odoo/owl";
+import {useOwnedDialogs, useService} from "@web/core/utils/hooks";
import {FormViewDialog} from "@web/views/view_dialogs/form_view_dialog";
import {Layout} from "@web/search/layout";
import {SearchBar} from "@web/search/search_bar/search_bar";
@@ -15,7 +16,6 @@ import {extractFieldsFromArchInfo} from "@web/model/relational_model/utils";
import {session} from "@web/session";
import {standardViewProps} from "@web/views/standard_view_props";
import {useModelWithSampleData} from "@web/model/model";
-import {useOwnedDialogs, useService} from "@web/core/utils/hooks";
import {usePager} from "@web/search/pager_hook";
import {useSearchBarToggler} from "@web/search/search_bar/search_bar_toggler";
@@ -40,11 +40,10 @@ export class GeoengineController extends Component {
*/
usePager(() => {
const list = this.model.root;
- const {count, limit, offset} = list;
return {
- offset: offset,
- limit: limit,
- total: count,
+ offset: list.offset,
+ limit: list.limit,
+ total: list.count,
onUpdate: async ({offset, limit}) => {
await list.load({limit, offset});
this.render(true);
diff --git a/base_geoengine/static/src/js/views/geoengine/geoengine_record/geoengine_record.esm.js b/base_geoengine/static/src/js/views/geoengine/geoengine_record/geoengine_record.esm.js
index 6f02ef020..3e4f7c8e6 100644
--- a/base_geoengine/static/src/js/views/geoengine/geoengine_record/geoengine_record.esm.js
+++ b/base_geoengine/static/src/js/views/geoengine/geoengine_record/geoengine_record.esm.js
@@ -4,12 +4,12 @@
* Copyright 2023 ACSONE SA/NV
*/
+import {Component, onWillUpdateProps} from "@odoo/owl";
import {Field} from "@web/views/fields/field";
import {GeoengineCompiler} from "../geoengine_compiler.esm";
import {INFO_BOX_ATTRIBUTE} from "../geoengine_arch_parser.esm";
import {registry} from "@web/core/registry";
import {useViewCompiler} from "@web/views/view_compiler";
-import {Component, onWillUpdateProps} from "@odoo/owl";
import {user} from "@web/core/user";
const formatters = registry.category("formatters");
diff --git a/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.esm.js b/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.esm.js
index 3f10ecf12..c1131b02f 100644
--- a/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.esm.js
+++ b/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.esm.js
@@ -21,22 +21,22 @@ import {
reactive,
useState,
} from "@odoo/owl";
-import {GeoengineRecord} from "../geoengine_record/geoengine_record.esm";
-import {LayersPanel} from "../layers_panel/layers_panel.esm";
-import {RecordsPanel} from "../records_panel/records_panel.esm";
-import {RelationalModel} from "@web/model/relational_model/relational_model";
import {
addFieldDependencies,
extractFieldsFromArchInfo,
} from "@web/model/relational_model/utils";
-import {evaluateExpr} from "@web/core/py_js/py";
import {loadBundle, loadJS} from "@web/core/assets";
+import {GeoengineRecord} from "../geoengine_record/geoengine_record.esm";
+import {LayersPanel} from "../layers_panel/layers_panel.esm";
+import {RecordsPanel} from "../records_panel/records_panel.esm";
+import {RelationalModel} from "@web/model/relational_model/relational_model";
+import {evaluateExpr} from "@web/core/py_js/py";
import {getTemplate} from "@web/core/templates";
import {parseXML} from "@web/core/utils/xml";
import {rasterLayersStore} from "../../../raster_layers_store.esm";
import {registry} from "@web/core/registry";
-import {user} from "@web/core/user";
import {useService} from "@web/core/utils/hooks";
+import {user} from "@web/core/user";
import {vectorLayersStore} from "../../../vector_layers_store.esm";
/* CONSTANTS */
@@ -503,37 +503,35 @@ export class GeoengineRenderer extends Component {
*/
updateInfoBox(features) {
const feature = features.item(0);
- if (feature !== undefined) {
+ if (feature === undefined) {
+ this.hidePopup();
+ } else {
const popup = this.getPopup();
- if (feature !== undefined) {
- var attributes = feature.get("attributes");
+ var attributes = feature.get("attributes");
- if (this.cfg_models.includes(feature.get("model"))) {
- const model = this.models.find(
- (el) => el.model.resModel === feature.get("model")
- );
- this.mountGeoengineRecord({
- popup,
- archInfo: model.archInfo,
- templateDocs: model.archInfo.templateDocs,
- model: model.model,
- attributes,
- });
- } else {
- this.mountGeoengineRecord({
- popup,
- archInfo: this.props.archInfo,
- templateDocs: this.props.archInfo.templateDocs,
- model: this.props.data,
- attributes,
- });
- }
-
- var coord = ol.extent.getCenter(feature.getGeometry().getExtent());
- this.overlay.setPosition(coord);
+ if (this.cfg_models.includes(feature.get("model"))) {
+ const model = this.models.find(
+ (el) => el.model.resModel === feature.get("model")
+ );
+ this.mountGeoengineRecord({
+ popup,
+ archInfo: model.archInfo,
+ templateDocs: model.archInfo.templateDocs,
+ model: model.model,
+ attributes,
+ });
+ } else {
+ this.mountGeoengineRecord({
+ popup,
+ archInfo: this.props.archInfo,
+ templateDocs: this.props.archInfo.templateDocs,
+ model: this.props.data,
+ attributes,
+ });
}
- } else {
- this.hidePopup();
+
+ var coord = ol.extent.getCenter(feature.getGeometry().getExtent());
+ this.overlay.setPosition(coord);
}
}
@@ -697,9 +695,9 @@ export class GeoengineRenderer extends Component {
`legend-${vector.resId}`
);
if (legend !== null) {
- void (vector.isVisible
- ? (legend.style.display = "block")
- : (legend.style.display = "none"));
+ legend.style.display = vector.isVisible
+ ? "block"
+ : "none";
}
}
if (vector.onDomainChanged) {
@@ -1112,6 +1110,7 @@ export class GeoengineRenderer extends Component {
if (val) {
return chroma(val).alpha(opacity).css();
}
+ return undefined;
});
} else {
colors = scale
diff --git a/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.scss b/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.scss
index 74a32cdab..dd7e662d4 100644
--- a/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.scss
+++ b/base_geoengine/static/src/js/views/geoengine/geoengine_renderer/geoengine_renderer.scss
@@ -59,20 +59,38 @@
.ol-popup-closer {
text-decoration: none;
position: absolute;
- top: 2px;
+ top: 8px;
right: 8px;
}
.ol-popup-closer:after {
- content: "✖";
+ font-family: FontAwesome;
+ content: "\f00d";
+ display: inline-block;
+ padding: 4px 6px;
+ border-radius: 4px;
+ font-size: 18px;
+ transition: background-color 0.15s ease;
+ cursor: pointer;
+}
+.ol-popup-closer:hover:after {
+ background-color: rgba(0, 0, 0, 0.06);
}
.ol-popup-editor {
text-decoration: none;
position: absolute;
- top: 1px;
- right: 25px;
+ top: 8px;
+ right: 40px;
}
.ol-popup-editor:after {
font-family: FontAwesome;
content: "\f040";
+ display: inline-block;
+ padding: 4px 6px;
+ border-radius: 4px;
+ font-size: 18px;
+ transition: background-color 0.15s ease;
cursor: pointer;
}
+.ol-popup-editor:hover:after {
+ background-color: rgba(0, 0, 0, 0.06);
+}
diff --git a/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js b/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js
index 1bedf5f8f..73fd5467e 100644
--- a/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js
+++ b/base_geoengine/static/src/js/views/geoengine/layers_panel/layers_panel.esm.js
@@ -4,16 +4,16 @@
* Copyright 2023 ACSONE SA/NV
*/
-import {CheckBox} from "@web/core/checkbox/checkbox";
import {Component, onWillStart, useRef, useState} from "@odoo/owl";
+import {useOwnedDialogs, useService} from "@web/core/utils/hooks";
+import {CheckBox} from "@web/core/checkbox/checkbox";
import {DomainSelectorGeoFieldDialog} from "../../../widgets/domain_selector_geo_field/domain_selector_geo_field_dialog/domain_selector_geo_field_dialog.esm";
import {FormViewDialog} from "@web/views/view_dialogs/form_view_dialog";
import {_t} from "@web/core/l10n/translation";
import {rasterLayersStore} from "../../../raster_layers_store.esm";
import {rpc} from "@web/core/network/rpc";
-import {useOwnedDialogs, useService} from "@web/core/utils/hooks";
-import {user} from "@web/core/user";
import {useSortable} from "@web/core/utils/sortable_owl";
+import {user} from "@web/core/user";
import {vectorLayersStore} from "../../../vector_layers_store.esm";
export class LayersPanel extends Component {
diff --git a/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.esm.js b/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.esm.js
index 0e08e32ac..c22a1a542 100644
--- a/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.esm.js
+++ b/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.esm.js
@@ -3,9 +3,6 @@
/**
* Copyright 2023 ACSONE SA/NV
*/
-import {SearchBarRecords} from "./search_bar_records/search_bar_records.esm";
-import {useService} from "@web/core/utils/hooks";
-
import {
Component,
onWillRender,
@@ -13,6 +10,8 @@ import {
onWillUpdateProps,
useState,
} from "@odoo/owl";
+import {SearchBarRecords} from "./search_bar_records/search_bar_records.esm";
+import {useService} from "@web/core/utils/hooks";
export class RecordsPanel extends Component {
setup() {
@@ -70,7 +69,7 @@ export class RecordsPanel extends Component {
filterItems(value, items) {
const lowerValue = value.toLowerCase();
return items.filter(
- (item) => item.data.display_name.toLowerCase().indexOf(lowerValue) >= 0
+ (item) => item.data.name.toLowerCase().indexOf(lowerValue) >= 0
);
}
}
diff --git a/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml b/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml
index c2b1c0658..cd440d917 100644
--- a/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml
+++ b/base_geoengine/static/src/js/views/geoengine/records_panel/records_panel.xml
@@ -39,7 +39,7 @@
t-on-click="() => this.onDisplayPopupRecord(record)"
>
-
+
diff --git a/base_geoengine/static/src/js/widgets/geoengine_edit_map/field_geoengine_edit_map.esm.js b/base_geoengine/static/src/js/widgets/geoengine_edit_map/field_geoengine_edit_map.esm.js
index 4a4144d28..ad736c1f2 100644
--- a/base_geoengine/static/src/js/widgets/geoengine_edit_map/field_geoengine_edit_map.esm.js
+++ b/base_geoengine/static/src/js/widgets/geoengine_edit_map/field_geoengine_edit_map.esm.js
@@ -170,29 +170,10 @@ export class FieldGeoEngineEditMap extends Component {
* Allow you to setup the trash button and the draw interaction.
*/
setupControls() {
- if (!this.props.record.data[this.props.name]) {
- void (
- this.selectInteraction !== undefined &&
- this.map.removeInteraction(this.selectInteraction)
- );
- void (
- this.modifyInteraction !== undefined &&
- this.map.removeInteraction(this.modifyInteraction)
- );
- this.drawInteraction = new ol.interaction.Draw({
- type: this.geoType,
- source: this.source,
- });
- this.map.addInteraction(this.drawInteraction);
-
- this.drawInteraction.on("drawend", (e) => {
- this.onUIChange(e.feature.getGeometry());
- });
- } else {
- void (
- this.drawInteraction !== undefined &&
- this.map.removeInteraction(this.drawInteraction)
- );
+ if (this.props.record.data[this.props.name]) {
+ if (this.drawInteraction !== undefined) {
+ this.map.removeInteraction(this.drawInteraction);
+ }
this.selectInteraction = new ol.interaction.Select();
this.modifyInteraction = new ol.interaction.Modify({
features: this.selectInteraction.getFeatures(),
@@ -205,6 +186,22 @@ export class FieldGeoEngineEditMap extends Component {
this.onUIChange(item.getGeometry());
});
});
+ } else {
+ if (this.selectInteraction !== undefined) {
+ this.map.removeInteraction(this.selectInteraction);
+ }
+ if (this.modifyInteraction !== undefined) {
+ this.map.removeInteraction(this.modifyInteraction);
+ }
+ this.drawInteraction = new ol.interaction.Draw({
+ type: this.geoType,
+ source: this.source,
+ });
+ this.map.addInteraction(this.drawInteraction);
+
+ this.drawInteraction.on("drawend", (e) => {
+ this.onUIChange(e.feature.getGeometry());
+ });
}
const element = this.createTrashControl();
diff --git a/eslint.config.cjs b/eslint.config.cjs
index 0d5731f89..e245f3393 100644
--- a/eslint.config.cjs
+++ b/eslint.config.cjs
@@ -152,7 +152,7 @@ const config = [{
strict: ["error", "function"],
"use-isnan": "error",
- "jsdoc/check-tag-names": "warn",
+ "jsdoc/check-tag-names": ["warn", { definedTags: ["odoo-module"] }],
"jsdoc/check-types": "warn",
"jsdoc/require-param-description": "off",
"jsdoc/require-return": "off",