mirror of https://github.com/OCA/web.git
parent
477b5db43e
commit
4fd6076bc0
|
@ -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>
|
Loading…
Reference in New Issue