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",