From fd5456b533abc0441503a5ae4223578cf8918de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E6=9C=AA=E5=A4=AE?= <2996985766@qq.com> Date: Sun, 21 Sep 2025 22:18:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=A2=84=E8=A7=88=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=8C=87=E5=AE=9A=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- estate/views/estate_property_tag_views.xml | 31 +++++++++++++++ estate/views/estate_property_views.xml | 2 +- many2many_quick_preview/__init__.py | 3 +- many2many_quick_preview/__manifest__.py | 38 +++++++++---------- many2many_quick_preview/models/__init__.py | 1 + many2many_quick_preview/models/ir_ui_view.py | 17 +++++++++ .../static/src/js/many2many_tags_field.js | 17 ++++++++- 7 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 many2many_quick_preview/models/__init__.py create mode 100644 many2many_quick_preview/models/ir_ui_view.py diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml index d53a4ba0f..92380518e 100644 --- a/estate/views/estate_property_tag_views.xml +++ b/estate/views/estate_property_tag_views.xml @@ -15,6 +15,37 @@ + + + estate.property.tag.form + estate.property.tag + +
+ +

我是From01

+ + + + +
+
+
+
+ + estate.property.tag.form + estate.property.tag + +
+ +

我是From02

+ + + + +
+
+
+
estate.property.tag.search diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 9099ccfad..c2ed2b67b 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -15,7 +15,7 @@ - + diff --git a/many2many_quick_preview/__init__.py b/many2many_quick_preview/__init__.py index 7c68785e9..f5ba686bc 100644 --- a/many2many_quick_preview/__init__.py +++ b/many2many_quick_preview/__init__.py @@ -1 +1,2 @@ -# -*- coding: utf-8 -*- \ No newline at end of file +# -*- coding: utf-8 -*- +from . import models \ No newline at end of file diff --git a/many2many_quick_preview/__manifest__.py b/many2many_quick_preview/__manifest__.py index 6def65e54..a105ed354 100644 --- a/many2many_quick_preview/__manifest__.py +++ b/many2many_quick_preview/__manifest__.py @@ -1,25 +1,21 @@ { - 'name': 'Many2Many Quick Preview', - 'author': 'Odoo Hub', - 'category': 'Tools', - 'summary': 'Provides quick preview of records in many2many_tags, many2many preview many2many clickable odoo record preview many2many field preview many2many field clickable many2many tags clickable many2many_tags clickable many2many_tags preview tags preview tags clickable clickable tag quick preview odoo many2many quick view instant record preview odoo related records preview many2many smart preview preview related records odoo many2many instant access many2many detail preview many2many inline preview quick access to records odoo productivity enhancement odoo preview without opening record preview on hover odoo ui enhancement many2many relation preview clickable many2many tags many2many record access preview in tags odoo improve navigation many2many quick detail view', - 'description': """ - Many2Many Quick Preview is an Odoo app that allows users to instantly preview related records in many2many fields directly from the many2many_tags. - This app improves navigation and productivity by providing quick access to record details without having to open them individually. - """, - 'maintainer': 'Odoo Hub', - 'website': 'https://apps.odoo.com/apps/modules/browse?author=Odoo%20Hub', - 'version': '1.0', - 'depends': ['base', 'web'], - 'assets': { - 'web.assets_backend': [ - 'many2many_quick_preview/static/src/js/many2many_tags_field.js', + "name": "Many2Many Quick Preview", + "author": "Odoo Hub", + "category": "Tools", + "summary": "Many2Many快速预览", + "description": "Many2Many快速预览", + "maintainer": "Odoo Hub", + "website": "#", + "version": "17.0.0.1", + "depends": ["base", "web"], + "assets": { + "web.assets_backend": [ + "many2many_quick_preview/static/src/js/many2many_tags_field.js", ], }, - 'images': ['static/description/banner.png'], - 'live_test_url': 'https://youtu.be/dNF106wVNX0', - 'installable': True, - 'application': True, - 'auto_install': False, - 'license': 'LGPL-3', + "images": ["static/description/banner.png"], + "installable": True, + "application": True, + "auto_install": False, + "license": "LGPL-3", } diff --git a/many2many_quick_preview/models/__init__.py b/many2many_quick_preview/models/__init__.py new file mode 100644 index 000000000..81f52e3bf --- /dev/null +++ b/many2many_quick_preview/models/__init__.py @@ -0,0 +1 @@ +from . import ir_ui_view diff --git a/many2many_quick_preview/models/ir_ui_view.py b/many2many_quick_preview/models/ir_ui_view.py new file mode 100644 index 000000000..35a34aa7c --- /dev/null +++ b/many2many_quick_preview/models/ir_ui_view.py @@ -0,0 +1,17 @@ +from odoo import models, fields, api + + +class IrUiView(models.Model): + _inherit = "ir.ui.view" + + @api.model + def get_view_id_from_xmlid(self, xmlid): + """根据 xmlid 返回 ir.ui.view 的 id""" + if not xmlid or "." not in xmlid: + return False + try: + record = self.env.ref(xmlid) + return record.id if record and record._name == "ir.ui.view" else False + except ValueError: + # xmlid 不存在时 env.ref 会抛异常 + return False diff --git a/many2many_quick_preview/static/src/js/many2many_tags_field.js b/many2many_quick_preview/static/src/js/many2many_tags_field.js index d10630317..6c8cd1fac 100644 --- a/many2many_quick_preview/static/src/js/many2many_tags_field.js +++ b/many2many_quick_preview/static/src/js/many2many_tags_field.js @@ -28,17 +28,30 @@ patch(Many2ManyTagsField.prototype, { return props; }, - onTagClick(ev, record) { + async onTagClick(ev, record) { // 阻止默认的标签点击行为 ev.stopPropagation(); ev.preventDefault(); + const context = record.evalContext?.context || {}; + let viewId = false; + if (context.open_form_view) { + try { + viewId = await this.orm.call( + "ir.ui.view", + "get_view_id_from_xmlid", + [context.open_form_view] + ); + } catch (error) { + console.error("获取指定 XML ID 的视图 ID 失败:", context.open_form_view, error); + } + } // 执行自定义动作 this.env.services.action.doAction({ type: "ir.actions.act_window", name: record?.data?.display_name, res_model: this.relation, res_id: record.resId, - views: [[false, "form"]], + views: [[viewId, "form"]], target: "new", }); },