Adam Heinz 2025-04-22 14:36:36 +02:00 committed by GitHub
commit 737924682d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
26 changed files with 1129 additions and 0 deletions

View File

@ -0,0 +1,106 @@
======================
Widget Open on new Tab
======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:90d7cc228138169b341debfd9c1b844aad258431599a76243147e17916e53b0f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github
:target: https://github.com/OCA/web/tree/18.0/web_widget_open_tab
:alt: OCA/web
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_widget_open_tab
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This addon introduces a new widget. When added to a field in a tree
view, the field appears as a button which opens the record in a new tab.
When clicking on the line (but not on the button), the record is opened
in the same window (as in native Odoo).
**Table of contents**
.. contents::
:local:
Usage
=====
Edit the tree view and add the widget as the first field, usually, we
should use: .. code-block:: xml
<field name="id" widget="open_tab"/>
You can open the record in a new tab when clicking with the mouse wheel
on the external link icon. On a usual click the record will be opened
without changes (keeping the breadcrumbs).
You can also add open-tab field in tree views by selecting "Add Open Tab
Field" field in the ir.model record. When you do this, the open-tab
field is added right after the name field in the tree if the field
exists, otherwise at the beginning of the tree.
Known issues / Roadmap
======================
- Add many2one fields support.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/web/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/web/issues/new?body=module:%20web_widget_open_tab%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Creu Blanca
Contributors
------------
- Enric Tobella <etobella@creublanca.es>
- Raf Ven <raf.ven@dynapps.be>
- Dhara Solanki <dhara.solanki@initos.com>
- `Quartile <https://www.quartile.co>`__:
- Aung Ko Ko Lin
Maintainers
-----------
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/web <https://github.com/OCA/web/tree/18.0/web_widget_open_tab>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1 @@
from . import models

View File

@ -0,0 +1,23 @@
# Copyright 2019-2020 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Widget Open on new Tab",
"summary": """
Allow to open record from trees on new tab from tree views""",
"version": "18.0.1.0.0",
"license": "AGPL-3",
"author": "Creu Blanca,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/web",
"depends": ["web"],
"demo": ["demo/res_users_view.xml"],
"data": [
"views/ir_model_views.xml",
],
"assets": {
"web.assets_backend": [
"web_widget_open_tab/static/src/xml/open_tab_widget.xml",
"web_widget_open_tab/static/src/js/open_tab_widget.js",
],
},
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_users_tree" model="ir.ui.view">
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_tree" />
<field name="arch" type="xml">
<field name="name" position="before">
<field name="id" widget="open_tab" />
</field>
</field>
</record>
</odoo>

View File

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_open_tab
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-02-17 13:45+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_widget_open_tab
#: model:ir.model.fields,field_description:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Add Open Tab Field"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model.fields,help:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Adds open-tab field in list views."
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_base
msgid "Base"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Click to open on new tab"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_ir_model
msgid "Models"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Open Tab"
msgstr ""
#, python-format
#~ msgid "Click in order to open on new tab"
#~ msgstr "Feu clic per obrir la pestanya nova"
#, python-format
#~ msgid "Widget"
#~ msgstr "Widget"

View File

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_open_tab
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-10-13 20:46+0000\n"
"Last-Translator: Corneliuus <cornelius@clk-it.de>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: web_widget_open_tab
#: model:ir.model.fields,field_description:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Add Open Tab Field"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model.fields,help:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Adds open-tab field in list views."
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_base
msgid "Base"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Click to open on new tab"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_ir_model
msgid "Models"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Open Tab"
msgstr ""
#, python-format
#~ msgid "Click in order to open on new tab"
#~ msgstr "Anklicken, um in einem neuen Tab zu öffnen"
#, python-format
#~ msgid "Widget"
#~ msgstr "Widget"

View File

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_open_tab
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-09-20 17:50+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: web_widget_open_tab
#: model:ir.model.fields,field_description:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Add Open Tab Field"
msgstr "Añadir campo de pestaña abierta"
#. module: web_widget_open_tab
#: model:ir.model.fields,help:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Adds open-tab field in list views."
msgstr "Añade un campo de pestaña abierta en las vistas de lista."
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_base
msgid "Base"
msgstr "Base"
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Click to open on new tab"
msgstr "Haga clic para abrir en una nueva pestaña"
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_ir_model
msgid "Models"
msgstr "Modelos"
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Open Tab"
msgstr "Abrir pestaña"
#, python-format
#~ msgid "Click in order to open on new tab"
#~ msgstr "Clica para poder abrir una nueva pestaña"
#, python-format
#~ msgid "Widget"
#~ msgstr "Widget"

View File

@ -0,0 +1,51 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_open_tab
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-05-20 13:38+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: web_widget_open_tab
#: model:ir.model.fields,field_description:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Add Open Tab Field"
msgstr "Aggiungi campo apri linguetta"
#. module: web_widget_open_tab
#: model:ir.model.fields,help:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Adds open-tab field in list views."
msgstr "Aggiunge campo apri linguetta nella viste elenco."
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_base
msgid "Base"
msgstr "Base"
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Click to open on new tab"
msgstr "Fare clic per aprire un una nuova linguetta"
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_ir_model
msgid "Models"
msgstr "Modelli"
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Open Tab"
msgstr "Apri linguetta"

View File

@ -0,0 +1,51 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_open_tab
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-27 08:24+0000\n"
"PO-Revision-Date: 2023-05-27 08:24+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: web_widget_open_tab
#: model:ir.model.fields,field_description:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Add Open Tab Field"
msgstr "別タブ表示ボタン追加"
#. module: web_widget_open_tab
#: model:ir.model.fields,help:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Adds open-tab field in list views."
msgstr "リストビューに別タブ表示ボタンを追加。"
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_base
msgid "Base"
msgstr "ベース"
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Click to open on new tab"
msgstr "クリックして別タブを開く"
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_ir_model
msgid "Models"
msgstr "モデル"
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Open Tab"
msgstr "別タブを開く"

View File

@ -0,0 +1,49 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_open_tab
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
#. module: web_widget_open_tab
#: model:ir.model.fields,field_description:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Add Open Tab Field"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model.fields,help:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Adds open-tab field in list views."
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_base
msgid "Base"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Click to open on new tab"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_ir_model
msgid "Models"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Open Tab"
msgstr ""

View File

@ -0,0 +1,48 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_widget_open_tab
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: web_widget_open_tab
#: model:ir.model.fields,field_description:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Add Open Tab Field"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model.fields,help:web_widget_open_tab.field_ir_model__add_open_tab_field
msgid "Adds open-tab field in list views."
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_base
msgid "Base"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Click to open on new tab"
msgstr ""
#. module: web_widget_open_tab
#: model:ir.model,name:web_widget_open_tab.model_ir_model
msgid "Models"
msgstr ""
#. module: web_widget_open_tab
#. odoo-javascript
#: code:addons/web_widget_open_tab/static/src/js/open_tab_widget.esm.js:0
#, python-format
msgid "Open Tab"
msgstr ""

View File

@ -0,0 +1,2 @@
from . import ir_model
from . import ir_ui_view

View File

@ -0,0 +1,10 @@
# Copyright 2023 Quartile Limited
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class IrModel(models.Model):
_inherit = "ir.model"
add_open_tab_field = fields.Boolean(help="Adds open-tab field in list views.")

View File

@ -0,0 +1,25 @@
# Copyright 2023 Quartile Limited
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from lxml import etree
from odoo import api, models
class Base(models.AbstractModel):
_inherit = "base"
@api.model
def _get_view(self, view_id=None, view_type="form", **options):
arch, view = super()._get_view(view_id, view_type, **options)
model = self.env["ir.model"]._get(self._name)
if view_type == "list" and model.add_open_tab_field:
id_elem = """<field name="id" widget="open_tab" nolabel="1"/>"""
id_elem = etree.fromstring(id_elem)
node = arch.xpath("//list")[0]
name_field = node.xpath('./field[@name="name"]')
if name_field:
node.insert(name_field[0].getparent().index(name_field[0]) + 1, id_elem)
else:
node.insert(0, id_elem)
return arch, view

View File

@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@ -0,0 +1,5 @@
- Enric Tobella \<<etobella@creublanca.es>\>
- Raf Ven \<<raf.ven@dynapps.be>\>
- Dhara Solanki \<<dhara.solanki@initos.com>\>
- [Quartile](https://www.quartile.co):
- Aung Ko Ko Lin

View File

@ -0,0 +1,4 @@
This addon introduces a new widget. When added to a field in a tree
view, the field appears as a button which opens the record in a new tab.
When clicking on the line (but not on the button), the record is opened
in the same window (as in native Odoo).

View File

@ -0,0 +1 @@
- Add many2one fields support.

View File

@ -0,0 +1,13 @@
Edit the tree view and add the widget as the first field, usually, we
should use: .. code-block:: xml
> \<field name="id" widget="open_tab"/\>
You can open the record in a new tab when clicking with the mouse wheel
on the external link icon. On a usual click the record will be opened
without changes (keeping the breadcrumbs).
You can also add open-tab field in tree views by selecting "Add Open Tab
Field" field in the ir.model record. When you do this, the open-tab
field is added right after the name field in the tree if the field
exists, otherwise at the beginning of the tree.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,454 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Widget Open on new Tab</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="widget-open-on-new-tab">
<h1 class="title">Widget Open on new Tab</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:90d7cc228138169b341debfd9c1b844aad258431599a76243147e17916e53b0f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/web/tree/18.0/web_widget_open_tab"><img alt="OCA/web" src="https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_widget_open_tab"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/web&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This addon introduces a new widget. When added to a field in a tree
view, the field appears as a button which opens the record in a new tab.
When clicking on the line (but not on the button), the record is opened
in the same window (as in native Odoo).</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-2">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>Edit the tree view and add the widget as the first field, usually, we
should use: .. code-block:: xml</p>
<blockquote>
&lt;field name=”id” widget=”open_tab”/&gt;</blockquote>
<p>You can open the record in a new tab when clicking with the mouse wheel
on the external link icon. On a usual click the record will be opened
without changes (keeping the breadcrumbs).</p>
<p>You can also add open-tab field in tree views by selecting “Add Open Tab
Field” field in the ir.model record. When you do this, the open-tab
field is added right after the name field in the tree if the field
exists, otherwise at the beginning of the tree.</p>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#toc-entry-2">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Add many2one fields support.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/web/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/web/issues/new?body=module:%20web_widget_open_tab%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<ul class="simple">
<li>Creu Blanca</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<ul class="simple">
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
<li>Raf Ven &lt;<a class="reference external" href="mailto:raf.ven&#64;dynapps.be">raf.ven&#64;dynapps.be</a>&gt;</li>
<li>Dhara Solanki &lt;<a class="reference external" href="mailto:dhara.solanki&#64;initos.com">dhara.solanki&#64;initos.com</a>&gt;</li>
<li><a class="reference external" href="https://www.quartile.co">Quartile</a>:<ul>
<li>Aung Ko Ko Lin</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/web/tree/18.0/web_widget_open_tab">OCA/web</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,46 @@
/** @odoo-module */
import {Component} from "@odoo/owl";
import {_t} from "@web/core/l10n/translation";
import {registry} from "@web/core/registry";
import {standardFieldProps} from "@web/views/fields/standard_field_props";
export class OpenTabWidget extends Component {
openNewTab(ev) {
ev.stopPropagation();
}
_getReference() {
var url = window.location.href;
var searchParams = new URLSearchParams(url.split("#")[1]);
searchParams.set("view_type", "form");
searchParams.set("id", this.props.record.data.id);
if (
!searchParams.has("model") ||
searchParams.get("model") !== this.props.record.resModel
) {
searchParams.set("model", this.props.record.resModel);
searchParams.delete("action");
}
return url.split("#")[0] + "#" + searchParams.toString();
}
loadAttrs(ev) {
// $(ev.target).tooltip(); FIXME
}
}
OpenTabWidget.template = "web_widget_open_tab.openTab";
OpenTabWidget.props = {
...standardFieldProps,
title: {type: String, optional: true},
};
export const openTabWidget = {
component: OpenTabWidget,
displayName: _t("Open Tab"),
supportedTypes: ["integer"],
extractProps: () => ({
title: _t("Click to open on new tab"),
}),
};
registry.category("fields").add("open_tab", openTabWidget);

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<template>
<t t-name="web_widget_open_tab.openTab">
<a
class="btn open_tab_widget fa fa-external-link"
t-att-href="_getReference()"
target="_blank"
t-on-click="openNewTab"
t-att-title="props.title"
t-on-mouseenter="ev => this.loadAttrs(ev)"
/>
</t>
</template>

View File

@ -0,0 +1 @@
from . import test_main

View File

@ -0,0 +1,21 @@
from odoo.tests import common
class Test(common.TransactionCase):
def test_add_open_tab_field(self):
self.env["ir.model"]._get("res.company").add_open_tab_field = True
arch, view = self.env["res.company"]._get_view(view_id=None, view_type="list")
found = arch.xpath("//field[@widget='open_tab']")
self.assertEqual(len(found), 1)
def test_no_add_open_tab_field(self):
self.env["ir.model"]._get("res.company").add_open_tab_field = False
arch, view = self.env["res.company"]._get_view(view_id=None, view_type="list")
found = arch.xpath("//field[@widget='open_tab']")
self.assertFalse(found)
def test_add_open_tab_field_no_name_field(self):
self.env["ir.model"]._get("res.groups").add_open_tab_field = True
arch, view = self.env["res.groups"]._get_view(view_id=None, view_type="list")
found = arch.xpath("//field[@widget='open_tab']")
self.assertEqual(len(found), 1)

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="ir_model_view" model="ir.ui.view">
<field name="name">ir.model.view.form</field>
<field name="model">ir.model</field>
<field name="inherit_id" ref="base.view_model_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='transient']" position="after">
<field name="add_open_tab_field" />
</xpath>
</field>
</record>
</odoo>