Pierre Verkest
9 years ago
committed by
Holger Brunn
7 changed files with 262 additions and 0 deletions
-
83web_duplicate_visibility/README.rst
-
1web_duplicate_visibility/__init__.py
-
25web_duplicate_visibility/__openerp__.py
-
12web_duplicate_visibility/demo/res_users_view.xml
-
35web_duplicate_visibility/static/src/js/duplicate_visibility.js
-
82web_duplicate_visibility/static/test/duplicate_visibility.js
-
24web_duplicate_visibility/views/assets.xml
@ -0,0 +1,83 @@ |
|||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
======================== |
||||
|
Web duplicate visibility |
||||
|
======================== |
||||
|
|
||||
|
This module allows to manage the visibility of duplicate button from the form |
||||
|
view declaration. |
||||
|
|
||||
|
Usage |
||||
|
===== |
||||
|
|
||||
|
While the default behavior of odoo is to display the duplicate button when user |
||||
|
is allowed to create a new object. You are now able to remove duplicate button |
||||
|
explicitly even if you are able to create new object:: |
||||
|
|
||||
|
<record id="view_form_id" model="ir.ui.view"> |
||||
|
<field name="name">view name</field> |
||||
|
<field name="model">my.model</field> |
||||
|
<field name="priority" eval="10"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="..." duplicate="0"> |
||||
|
... |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
or by extending an existing view:: |
||||
|
|
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//form" position="attributes"> |
||||
|
<attribute name="duplicate">0</attribute> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
|
||||
|
|
||||
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
||||
|
:alt: Try me on Runbot |
||||
|
:target: https://runbot.odoo-community.org/runbot/repo/github-com-oca-web-162 |
||||
|
|
||||
|
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 smashing it by providing a detailed and welcomed `feedback |
||||
|
<https://github.com/OCA/web/issues/new?body=module:%20web_duplicate_visibility%0 |
||||
|
Aversion:%209.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20 |
||||
|
behavior**%0A%0A**Expected%20behavior**>`_. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Images |
||||
|
------ |
||||
|
|
||||
|
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/ |
||||
|
blob/master/template/module/static/description/icon.svg>`_. |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* Pierre Verkest <pverkest@anybox.fr> |
||||
|
* Christophe Combelles <ccomb@anybox.fr> |
||||
|
* Simon André <sandre@anybox.fr> |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
.. image:: https://odoo-community.org/logo.png |
||||
|
:alt: Odoo Community Association |
||||
|
:target: https://odoo-community.org |
||||
|
|
||||
|
This module is maintained by the OCA. |
||||
|
|
||||
|
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. |
||||
|
|
||||
|
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1 @@ |
|||||
|
# -*- coding: utf-8 -*- |
@ -0,0 +1,25 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Pierre Verkest <pverkest@anybox.fr> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
{ |
||||
|
"name": "web duplicate visibility", |
||||
|
"summary": "Manage the duplicate button visibiliy", |
||||
|
"version": "9.0.1.0.0", |
||||
|
"category": "web", |
||||
|
"website": "https://odoo-community.org/", |
||||
|
"author": "Pierre Verkest <pverkest@anybox.fr>," |
||||
|
" Odoo Community Association (OCA)", |
||||
|
"license": "AGPL-3", |
||||
|
"application": False, |
||||
|
"installable": True, |
||||
|
"depends": [ |
||||
|
"base", |
||||
|
"web", |
||||
|
], |
||||
|
"data": [ |
||||
|
"views/assets.xml", |
||||
|
], |
||||
|
"demo": [ |
||||
|
"demo/res_users_view.xml", |
||||
|
], |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<odoo> |
||||
|
<record id="view_users_form" model="ir.ui.view"> |
||||
|
<field name="inherit_id" ref="base.view_users_form"/> |
||||
|
<field name="model">res.users</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//form" position="attributes"> |
||||
|
<attribute name="duplicate">0</attribute> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,35 @@ |
|||||
|
odoo.define('web.DuplicateVisibility',function (require) { |
||||
|
"use strict"; |
||||
|
|
||||
|
var core = require('web.core'); |
||||
|
var Sidebar = require('web.Sidebar'); |
||||
|
var FormView = require('web.FormView'); |
||||
|
|
||||
|
var _t = core._t; |
||||
|
|
||||
|
var DuplicateVisibility = FormView.include({ |
||||
|
/** |
||||
|
* Instantiate and render the sidebar if a sidebar is requested |
||||
|
* Sets this.sidebar |
||||
|
* @param {jQuery} [$node] a jQuery node where the sidebar should be inserted |
||||
|
* $node may be undefined, in which case the FormView inserts the sidebar in a |
||||
|
* div of its template |
||||
|
**/ |
||||
|
render_sidebar: function($node) { |
||||
|
var res = this._super.apply(this, arguments); |
||||
|
if (this.sidebar) { |
||||
|
if(!this.is_action_enabled('duplicate') && |
||||
|
this.sidebar.items.hasOwnProperty('other')){ |
||||
|
this.sidebar.items.other = this.sidebar.items.other.filter( |
||||
|
function(item){ |
||||
|
return item.label !== _t("Duplicate"); |
||||
|
} |
||||
|
); |
||||
|
this.sidebar.redraw(); |
||||
|
} |
||||
|
} |
||||
|
return res; |
||||
|
}, |
||||
|
}); |
||||
|
|
||||
|
}); |
@ -0,0 +1,82 @@ |
|||||
|
"use strict"; |
||||
|
odoo.define_section('web_duplicate_visibility', |
||||
|
['web.data', 'web.FormView'], |
||||
|
function(test, mock){ |
||||
|
|
||||
|
function assertDuplicate(data, FormView, form_tag, visible){ |
||||
|
mock.add('test.model:read', function () { |
||||
|
return [{ id: 1, a: 'foo', b: 'bar', c: 'baz' }]; |
||||
|
}); |
||||
|
|
||||
|
mock.add('test.model:fields_view_get', function () { |
||||
|
return { |
||||
|
type: 'form', |
||||
|
fields: { |
||||
|
a: {type: 'char', string: "A"}, |
||||
|
b: {type: 'char', string: "B"}, |
||||
|
c: {type: 'char', string: "C"} |
||||
|
}, |
||||
|
arch: form_tag + |
||||
|
' <field name="a"/>' + |
||||
|
' <field name="b"/>' + |
||||
|
' <field name="c"/>' + |
||||
|
'</form>', |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
var ds = new data.DataSetStatic(null, 'test.model', null, [1]); |
||||
|
ds.index = 0; |
||||
|
var $fix = $( "#qunit-fixture"); |
||||
|
var form = new FormView( |
||||
|
{}, |
||||
|
ds, |
||||
|
false, |
||||
|
{ |
||||
|
sidebar: true, |
||||
|
} |
||||
|
); |
||||
|
form.appendTo($fix); |
||||
|
form.do_show(); |
||||
|
form.render_sidebar(); |
||||
|
|
||||
|
var $fix = $( "#qunit-fixture"); |
||||
|
var actions = $fix.find('.oe_sidebar a[data-section="other"]').filter( |
||||
|
function(i, obj){ |
||||
|
return obj.text.trim() == "Duplicate"; |
||||
|
} |
||||
|
); |
||||
|
strictEqual( |
||||
|
actions.length, visible, "duplicate state is not as expected" |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
test('Duplicate button visible when nothing set', |
||||
|
function(assert, data, FormView){ |
||||
|
assertDuplicate(data, FormView, '<form>', 1); |
||||
|
}); |
||||
|
|
||||
|
test('Duplicate button visible when create="1"', |
||||
|
function(assert, data, FormView){ |
||||
|
assertDuplicate(data, FormView, '<form create="1">', 1); |
||||
|
}); |
||||
|
|
||||
|
test('Duplicate button visible when duplicate="1"', |
||||
|
function(assert, data, FormView){ |
||||
|
assertDuplicate(data, FormView, '<form duplicate="1">', 1); |
||||
|
}); |
||||
|
|
||||
|
test('Duplicate button not displayed when create="0"', |
||||
|
function(assert, data, FormView){ |
||||
|
assertDuplicate(data, FormView, '<form create="0">', 0); |
||||
|
}); |
||||
|
|
||||
|
test('Duplicate button not displayed when create="1" duplicate="0"', |
||||
|
function(assert, data, FormView){ |
||||
|
assertDuplicate(data, FormView, '<form create="1" duplicate="0">', 0); |
||||
|
}); |
||||
|
|
||||
|
test('Duplicate button not displayed when duplicate="0"', |
||||
|
function(assert, data, FormView){ |
||||
|
assertDuplicate(data, FormView, '<form duplicate="0">', 0); |
||||
|
}); |
||||
|
}); |
@ -0,0 +1,24 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<odoo> |
||||
|
<template id="assets_backend" |
||||
|
name="web_duplicate_visibility backend assets" |
||||
|
inherit_id="web.assets_backend"> |
||||
|
<xpath expr="." |
||||
|
position="inside"> |
||||
|
<script type="text/javascript" |
||||
|
src="/web_duplicate_visibility/static/src/js/duplicate_visibility.js"> |
||||
|
</script> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
|
||||
|
<template id="qunit_suite" |
||||
|
name="web_duplicate_visibility qunit assets" |
||||
|
inherit_id="web.qunit_suite"> |
||||
|
<xpath expr="//html/head" |
||||
|
position="inside"> |
||||
|
<script type="text/javascript" |
||||
|
src="/web_duplicate_visibility/static/test/duplicate_visibility.js"> |
||||
|
</script> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue