forked from Techsystech/web
[MIG] web_tree_many2one_clickable: Migration to 11.0
parent
c36cb88f21
commit
d0dd5546c0
|
@ -1,4 +1,4 @@
|
||||||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
||||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
:alt: License: AGPL-3
|
:alt: License: AGPL-3
|
||||||
|
|
||||||
|
@ -6,42 +6,21 @@
|
||||||
Clickable many2one fields for tree views
|
Clickable many2one fields for tree views
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
This addon provides a separate widget to allow many2one or reference fields in
|
This addon forces Odoo to use many2one widget on a many2one fields in
|
||||||
a tree view open the linked resource when clicking on their name.
|
tree views. This allows users to open linked resources from trees directly,
|
||||||
|
without accessing the form.
|
||||||
You can also define a system parameter to have this behaviour for all the
|
|
||||||
existing many2one fields in tree views.
|
|
||||||
|
|
||||||
Installation
|
|
||||||
============
|
|
||||||
|
|
||||||
Install it the regular way.
|
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
=============
|
=============
|
||||||
|
|
||||||
After installation, all many2one and reference fields will be clickable
|
After installation, all many2one and reference fields will be clickable by default.
|
||||||
by default. You can change this in *Configuration > Technical > Parameters > System parameters*,
|
|
||||||
parameter with name `web_tree_many2one_clickable.default` setting it to `false`.
|
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
=====
|
=====
|
||||||
|
|
||||||
For the widget option, you need to add `widget="many2one_clickable"` attribute
|
|
||||||
in the XML field definition in the tree view.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
`<field name="partner_id" widget="many2one_clickable" />`
|
|
||||||
|
|
||||||
will open the linked partner in a form view.
|
|
||||||
|
|
||||||
If system parameter `web_tree_many2one_clickable.default` is `true` and you
|
|
||||||
need to disable one field, then use `widget="many2one_unclickable"`
|
|
||||||
|
|
||||||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
|
||||||
:alt: Try me on Runbot
|
:alt: Try me on Runbot
|
||||||
:target: https://runbot.odoo-community.org/runbot/162/10.0
|
:target: https://runbot.odoo-community.org/runbot/162/11.0
|
||||||
|
|
||||||
|
|
||||||
Bug Tracker
|
Bug Tracker
|
||||||
|
@ -50,7 +29,7 @@ Bug Tracker
|
||||||
Bugs are tracked on `GitHub Issues
|
Bugs are tracked on `GitHub Issues
|
||||||
<https://github.com/OCA/web/issues>`_. In case of trouble, please
|
<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,
|
check there if your issue has already been reported. If you spotted it first,
|
||||||
help us smashing it by providing a detailed and welcomed feedback.
|
help us smash it by providing a detailed and welcomed feedback.
|
||||||
|
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
|
@ -63,6 +42,7 @@ Contributors
|
||||||
* Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>
|
* Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>
|
||||||
* Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
* Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
||||||
* Sodexis <dev@sodexis.com>
|
* Sodexis <dev@sodexis.com>
|
||||||
|
* Artem Kostyuk <a.kostyuk@mobilunity.com>
|
||||||
|
|
||||||
Maintainer
|
Maintainer
|
||||||
----------
|
----------
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2013 Therp BV (<http://therp.nl>).
|
# Copyright 2013 Therp BV (<http://therp.nl>).
|
||||||
# Copyright 2015 Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>
|
# Copyright 2015 Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>
|
||||||
# Copyright 2015 Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
# Copyright 2015 Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
||||||
|
@ -8,21 +7,19 @@
|
||||||
{
|
{
|
||||||
"name": "Clickable many2one fields for tree views",
|
"name": "Clickable many2one fields for tree views",
|
||||||
"summary": "Open the linked resource when clicking on their name",
|
"summary": "Open the linked resource when clicking on their name",
|
||||||
"version": "10.0.1.0.0",
|
"version": "11.0.1.0.0",
|
||||||
"category": "Hidden",
|
"category": "Hidden",
|
||||||
"website": "https://odoo-community.org/",
|
"website": "https://github.com/OCA/web",
|
||||||
"author": "Therp BV, "
|
"author": "Therp BV, "
|
||||||
"Tecnativa, "
|
"Tecnativa, "
|
||||||
|
"Camptocamp, "
|
||||||
"Odoo Community Association (OCA)",
|
"Odoo Community Association (OCA)",
|
||||||
"license": "AGPL-3",
|
"license": "AGPL-3",
|
||||||
"application": False,
|
|
||||||
"installable": True,
|
"installable": True,
|
||||||
"depends": [
|
"depends": [
|
||||||
'web',
|
'web',
|
||||||
],
|
],
|
||||||
"data": [
|
"data": [
|
||||||
'data/ir_config_parameter.xml',
|
'static/src/xml/assets.xml',
|
||||||
'views/asset.xml',
|
|
||||||
],
|
],
|
||||||
"installable": True,
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
|
|
||||||
|
|
||||||
<odoo noupdate="1">
|
|
||||||
|
|
||||||
<record id="default" model="ir.config_parameter">
|
|
||||||
<field name="key">web_tree_many2one_clickable.default</field>
|
|
||||||
<field name="value">true</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
|
@ -1,99 +1,21 @@
|
||||||
/* Copyright 2013 Therp BV (<http://therp.nl>).
|
/* Copyright 2013 Therp BV (<http://therp.nl>).
|
||||||
* Copyright 2015 Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>
|
* Copyright 2015 Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>
|
||||||
* Copyright 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
* Copyright 2016 Antonio Espinosa <antonio.espinosa@tecnativa.com>
|
||||||
# Copyright 2017 Sodexis <dev@sodexis.com>
|
* Copyright 2017 Sodexis <dev@sodexis.com>
|
||||||
|
* Copyright 2018 Camptocamp SA
|
||||||
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
|
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
|
||||||
|
|
||||||
odoo.define('web_tree_many2one_clickable.many2one_clickable', function(require) {
|
odoo.define('web_tree_many2one_clickable.many2one_clickable', function (require) {
|
||||||
"use strict";
|
var ListRenderer = require('web.ListRenderer');
|
||||||
|
|
||||||
var core = require('web.core');
|
ListRenderer.include({
|
||||||
var ListView = require('web.ListView');
|
_renderBodyCell: function (record, node, colIndex, options) {
|
||||||
var Model = require('web.DataModel');
|
if (!node.attrs.widget && this.state.fields[node.attrs.name].type === 'many2one') {
|
||||||
|
// no explicit widget provided on a many2one field,
|
||||||
var _t = core._t;
|
// force `many2one` widget
|
||||||
var QWeb = core.qweb;
|
node.attrs.widget = 'many2one';
|
||||||
var list_widget_registry = core.list_widget_registry;
|
|
||||||
|
|
||||||
var promise;
|
|
||||||
function clickable_get(callback){
|
|
||||||
if (_.isUndefined(promise)) {
|
|
||||||
promise = $.Deferred();
|
|
||||||
new Model("ir.config_parameter")
|
|
||||||
.call("get_param", ["web_tree_many2one_clickable.default", false])
|
|
||||||
.done(function(value){
|
|
||||||
promise.resolve(String(value).toLowerCase() === "true");
|
|
||||||
})
|
|
||||||
.fail(function(){
|
|
||||||
promise.reject();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
ListView.Column.include({
|
|
||||||
init: function(id, tag, attrs) {
|
|
||||||
this._super(id, tag, attrs);
|
|
||||||
if (this.widget == 'many2one_clickable') {
|
|
||||||
this.use_many2one_clickable = true;
|
|
||||||
} else if (this.type == 'many2one') {
|
|
||||||
this.use_many2one_clickable = false;
|
|
||||||
clickable_get().done($.proxy(function(value){
|
|
||||||
this.use_many2one_clickable = value;
|
|
||||||
}, this));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
_format: function (row_data, options) {
|
|
||||||
if (this.type == 'many2one' &&
|
|
||||||
(this.widget == 'many2one_unclickable' || this.use_many2one_clickable) &&
|
|
||||||
!!row_data[this.id]) {
|
|
||||||
var value = row_data[this.id].value;
|
|
||||||
var name = value[1] ? value[1].split("\n")[0] : value[1];
|
|
||||||
name = _.escape(name || options.value_if_empty);
|
|
||||||
if (this.widget == 'many2one_unclickable') {
|
|
||||||
return name;
|
|
||||||
} else if (this.use_many2one_clickable) {
|
|
||||||
var values = {
|
|
||||||
model: this.relation,
|
|
||||||
id: row_data[this.id].value[0],
|
|
||||||
name: name,
|
|
||||||
};
|
|
||||||
if(this.type == 'reference' && !!row_data[this.id + '__display']) {
|
|
||||||
values.model = row_data[this.id].value.split(',', 1)[0];
|
|
||||||
values.id = row_data[this.id].value.split(',', 2)[1];
|
|
||||||
values.name = _.escape(row_data[this.id + '__display'].value ||
|
|
||||||
options.value_if_empty);
|
|
||||||
}
|
|
||||||
return _.str.sprintf(
|
|
||||||
'<a class="oe_form_uri" data-many2one-clickable-model="%(model)s" data-many2one-clickable-id="%(id)s">%(name)s</a>',
|
|
||||||
values
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} else {
|
return this._super(record, node, colIndex, options);
|
||||||
return this._super(row_data, options);
|
|
||||||
}
|
}
|
||||||
},
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
ListView.List.include({
|
|
||||||
render: function() {
|
|
||||||
var result = this._super(this, arguments),
|
|
||||||
self = this;
|
|
||||||
this.$current.delegate('a[data-many2one-clickable-model]',
|
|
||||||
'click', function() {
|
|
||||||
self.view.do_action({
|
|
||||||
type: 'ir.actions.act_window',
|
|
||||||
res_model: $(this).data('many2one-clickable-model'),
|
|
||||||
res_id: $(this).data('many2one-clickable-id'),
|
|
||||||
views: [[false, 'form']],
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
list_widget_registry.add('field.many2one_clickable', ListView.Column);
|
|
||||||
list_widget_registry.add('field.many2one_unclickable', ListView.Column);
|
|
||||||
|
|
||||||
}); // odoo.define
|
|
||||||
|
|
|
@ -3,10 +3,9 @@
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<template id="assets_backend" name="Many2one clickable assets" inherit_id="web.assets_backend">
|
<template id="assets_backend" name="web_tree_many2one_clickable assets" inherit_id="web.assets_backend">
|
||||||
<xpath expr="." position="inside">
|
<xpath expr="." position="inside">
|
||||||
<script type="text/javascript"
|
<script type="text/javascript" src="/web_tree_many2one_clickable/static/src/js/web_tree_many2one_clickable.js"/>
|
||||||
src="/web_tree_many2one_clickable/static/src/js/web_tree_many2one_clickable.js"/>
|
|
||||||
</xpath>
|
</xpath>
|
||||||
</template>
|
</template>
|
||||||
|
|
Loading…
Reference in New Issue