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