3
votes

I want to hide "Create and Edit" button in all form

and also I want to show "Search More" button in all form

Hide and Show button for all module

Currently Im using odoo 10.

Let's see this addons

https://apps.openerp.com/apps/modules/9.0/web_m2x_options/

I have tried to using that addons, but it does not works at all.

Someone can help me in these case? whether using that addons, or another simple ways to do what I need to do.

I would be apreciate for any responses.

Thanks in advance.

3

3 Answers

2
votes

It's possible to use it for all module. But You need to create a record in the ir.config.parameter.

Configuration -> Technical -> Parameters -> System Parameters

To remove the create_edit button you must add this information.

Key :"web_m2x_options.create_edit" Value : "false".

And to add search more on any many2one and Many2many field, you must add.

Key :"web_m2x_options.search_more" Value : "true".

PS: You can see more information on this github page https://github.com/OCA/web/tree/9.0/web_m2x_options

2
votes

Here i will change the default behavor of odoo to show create and edit when i want to by using this :

       <field name="many2one_field" options="{'create':true, 'quick_create':true}"/>

Now under your costum module direcotry define a javascript file to change the many2one widget

  you_costum_module_directory_name 
        --> static
            --> src 
                  --> js
                      --> costum_many2one_widget.js

javascript file:

odoo.define('you_costum_module_directory_name.costum_many2one_widget' , function(require) {
    // I hope that you know how to add this to odoo backendassets

        // first we need core
        var core = require('web.core');
        // it's needed when we override get_search_result
        var data = require('web.data');

        // NOTE: i may forget to require some object in the code by mistake check it 

        // now we must get the many2one widget for form widget
        var FieldMany2One = core.form_widget_registry.get('many2one');

        // now we can override the method to change the behavor
        FieldMany2one.include({
            // if you want the search more to be always shown we must overrid
            // get_search_result and we need to require every thing we need first like data object
            // now to show search more always we must reimplement the 
            get_search_result: function(search_val) {
                var self = this;

                var dataset = new data.DataSet(this, this.field.relation, self.build_context());
                this.last_query = search_val;
                var exclusion_domain = [], ids_blacklist = this.get_search_blacklist();
                if (!_(ids_blacklist).isEmpty()) {
                    exclusion_domain.push(['id', 'not in', ids_blacklist]);
                }

                return this.orderer.add(dataset.name_search(
                        search_val, new data.CompoundDomain(self.build_domain(), exclusion_domain),
                        'ilike', this.limit + 1, self.build_context())).then(function(_data) {
                    self.last_search = _data;
                    // possible selections for the m2o
                    var values = _.map(_data, function(x) {
                        x[1] = x[1].split("\n")[0];
                        return {
                            label: _.str.escapeHTML(x[1].trim()) || data.noDisplayContent,
                            value: x[1],
                            name: x[1],
                            id: x[0],
                        };
                    });

                    // show search more if there is only one element at least 
                    // you can make it 0 if you want
                    if (values.length >= 1) {
                        values = values.slice(0, self.limit);
                        values.push({
                            label: _t("Search More..."),
                            action: function() {
                                dataset.name_search(search_val, self.build_domain(), 'ilike', 160).done(function(_data) {
                                    self._search_create_popup("search", _data);
                                });
                            },
                            classname: 'o_m2o_dropdown_option'
                        });
                    }
                    // if the user provide an option quick_create show quick create
                    var raw_result = _(_data.result).map(function(x) {return x[1];});
                    if (
                        search_val.length > 0 && 
                        !_.include(raw_result, search_val) &&
                        self.options && self.options.quick_create
                        ) {
                        self.can_create && values.push({
                            label: _.str.sprintf(_t('Create "<strong>%s</strong>"'),
                                $('<span />').text(search_val).html()),
                            action: function() {
                                self._quick_create(search_val);
                            },
                            classname: 'o_m2o_dropdown_option'
                        });
                    }
                    // if the user provide a create option show create and Edit option
                    if (self.options && self.options.create && self.can_create){
                        values.push({
                            label: _t("Create and Edit..."),
                            action: function() {
                                self._search_create_popup("form", undefined, self._create_context(search_val));
                            },
                            classname: 'o_m2o_dropdown_option'
                        });
                    }
                    else if (values.length === 0) {
                        values.push({
                            label: _t("No results to show..."),
                            action: function() {},
                            classname: 'o_m2o_dropdown_option'
                        });
                    }

                    return values;
                });
            }
        });


        // id don't know if this line is required or not 
        // but if we have to registre the widget again
        core.form_widget_registry.add('many2one', FieldMany2One);

    }); 

Now you need to add the js file to you backendassets template

you_costum_module_directory_name 
            --> static
                --> src 
                      --> js
                          --> costum_many2one_widget.js

            --> xml
                --> widgets.xml

add xml file to manifest :

<?xml version="1.0" encoding="utf-8" ?>
    <openerp> <!-- odoo in odoo 10.0 -->
        <data>

            <!--We need to load our js file to backend_assets-->
            <template id="assets_backend" name="many2one new edits " inherit_id="web.assets_backend">
                <xpath expr="." position="inside">
                    <script type="text/javascript" src="/you_costum_module_directory_name/static/src/js/costum_many2one_widget.js"></script>
                </xpath>
            </template>

        </data>
    </openerp>

in your manifest __openerp__.py add the xml file:

1
votes

You can take a slection widget to your field :

<field name="your_one2many_field" widget="selection"/>

To hide "Create and edit" use :

<field name="your_one2many_field" options="{'no_create_edit':True}"/>