Onchange 2 Fields in JavaScript Widgets

I need to use onchange function in JavaScript widgets

I have two fields in a JavaScript widget - 1st (the account that relates to contracts) and - 2nd (the task that relates to clients) and I want to use onchange between them

I want to change the account field based on the task field so that when a customer is selected, it should only download the contracts of that customer only.

Has anyone encountered this before? could you give examples?

Here is the photo i have 2 fields in that line

Here is my JavaScript code:

openerp.net2do_elkamel = function (instance) {

    var module = instance.hr_timesheet_sheet

    module.WeeklyTimesheet = module.WeeklyTimesheet.extend({
        events: {
            "click .oe_timesheet_weekly_account a": "go_to",
            "click .oe_timesheet_weekly_task a": "go_to_partner",
        },
        go_to_partner: function (event) {
            var id = JSON.parse($(event.target).data("cus-id"));
            this.do_action({
                type: 'ir.actions.act_window',
                res_model: "res.partner",
                res_id: id,
                views: [[false, 'form']],
                target: 'current'
            });
        },
        initialize_content: function () {
            var self = this;
            if (self.setting)
                return;
            // don't render anything until we have date_to and date_from
            if (!self.get("date_to") || !self.get("date_from"))
                return;
            this.destroy_content();

            // it important to use those vars to avoid race conditions
            var dates;
            var accounts;
            var account_names;
            var task_names;
            var default_get;
            return this.render_drop.add(new instance.web.Model("hr.analytic.timesheet").call("default_get", [
                ['account_id', 'customer', 'general_account_id', 'journal_id', 'date', 'name', 'user_id', 'product_id', 'product_uom_id', 'to_invoice', 'amount', 'unit_amount'],
                new instance.web.CompoundContext({'user_id': self.get('user_id')})]).then(function (result) {
                default_get = result;
                // calculating dates
                dates = [];
                var start = self.get("date_from");
                var end = self.get("date_to");
                while (start <= end) {
                    dates.push(start);
                    start = start.clone().addDays(1);
                }

                timesheet_lines = _(self.get("sheets")).chain()
                    .map(function (el) {
                        // much simpler to use only the id in all cases
                        if (typeof(el.account_id) === "object")
                            el.account_id = el.account_id[0];
                        if (typeof(el.customer) === "object")
                            el.customer = el.customer[0];
                        return el;
                    }).value();

                // group by account
                var timesheet_lines_by_account_id = _.groupBy(timesheet_lines, function (el) {
                    return el.account_id;
                });

                // group by account and customer
                var timesheet_lines_by_account_id_task_id = _.groupBy(timesheet_lines, function (el) {
                    return [el.account_id, el.customer];
                });

                var account_ids = _.map(_.keys(timesheet_lines_by_account_id), function (el) {
                    return el === "false" ? false : Number(el)
                });

                return new instance.web.Model("hr.analytic.timesheet").call("multi_on_change_account_id", [[], account_ids,
                    new instance.web.CompoundContext({'user_id': self.get('user_id')})]).then(function (accounts_defaults) {
                    accounts = _(timesheet_lines_by_account_id_task_id).chain().map(function (lines, account_id_task_id) {
                        account_defaults = _.extend({}, default_get, (accounts_defaults[lines[0].account_id] || {}).value || {});
                        // group by days
                        var index = _.groupBy(lines, "date");
                        var days = _.map(dates, function (date) {
                            var day = {day: date, lines: index[instance.web.date_to_str(date)] || []};
                            // add line where we will insert/remove hours
                            var to_add = _.find(day.lines, function (line) {
                                return line.name === self.description_line
                            });
                            if (to_add) {
                                day.lines = _.without(day.lines, to_add);
                                day.lines.unshift(to_add);
                            } else {
                                day.lines.unshift(_.extend(_.clone(account_defaults), {
                                    name: self.description_line,
                                    unit_amount: 0,
                                    date: instance.web.date_to_str(date),
                                    account_id: lines[0].account_id,
                                    customer: lines[0].customer,
                                }));
                            }
                            return day;
                        });
                        return {
                            account_task: account_id_task_id,
                            account: lines[0].account_id,
                            task: lines[0].customer,
                            days: days,
                            account_defaults: account_defaults
                        };
                    }).value();

                    // we need the name_get of the analytic accounts
                    return new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(accounts, "account"),
                        new instance.web.CompoundContext()]).then(function (result) {
                        account_names = {};
                        _.each(result, function (el) {
                            account_names[el[0]] = el[1];
                        });
                        // we need the name_get of the customer
                        return new instance.web.Model("res.partner").call("name_get", [_(accounts).chain().pluck("task").filter(function (el) {
                            return el;
                        }).value(),
                            new instance.web.CompoundContext()]).then(function (result) {
                            task_names = {};
                            _.each(result, function (el) {
                                task_names[el[0]] = el[1];
                            });
                            accounts = _.sortBy(accounts, function (el) {
                                return account_names[el.account];
                            });
                        });
                    });
                });
            })).then(function (result) {
                // we put all the gathered data in self, then we render
                self.dates = dates;
                self.accounts = accounts;
                self.account_names = account_names;
                self.task_names = task_names;
                self.default_get = default_get;
                //real rendering
                self.display_data();
            });
        },
        init_add_account: function () {
            var self = this;
            if (self.dfm)
                return;
            self.$(".oe_timesheet_weekly_add_row").show();
            self.dfm = new instance.web.form.DefaultFieldManager(self);
            self.dfm.extend_field_desc({
                account: {
                    relation: "account.analytic.account",
                },
                task: {
                    relation: "res.partner",
                },
            });
            self.task_m2o = new instance.web.form.FieldMany2One(self.dfm, {
                attrs: {
                    name: "task",
                    type: "many2one",
                    modifiers: '{"required": true}',
                },
            });


            self.account_m2o = new instance.web.form.FieldMany2One(self.dfm, {

                attrs: {
                    name: "account",
                    type: "many2one",
                    domain: [
                        ['type', 'in', ['normal', 'contract']],
                        ['use_timesheets', '=', 1],
                    ],
                    widget:"selection",

                    context: {
                        default_use_timesheets: 1,
                        default_type: "contract",
                        default_partner_id:self.task_m2o.value,
                    },
                    modifiers: '{"required": true}',
                },
            });


            self.task_m2o.prependTo(self.$(".oe_timesheet_weekly_add_row td"));
            self.account_m2o.prependTo(self.$(".oe_timesheet_weekly_add_row td"));

            self.account_m2o.$input.focusout(function () {
                var account_id = self.account_m2o.get_value();
                if (account_id === false) {
                    return;
                }
                self.task_m2o.init(self.dfm, {
                    attrs: {
                        name: "task",
                        type: "many2one",
                        context: {
                            'account_id': account_id,
                        },
                    },
                });
                // reset value previously selected
                self.task_m2o.set_value(false);
                self.task_m2o.render_value();
            });

            self.$(".oe_timesheet_weekly_add_row button").click(function () {
                var id = self.account_m2o.get_value();
                if (id === false) {
                    self.dfm.set({display_invalid_fields: true});
                    return;
                }
                var ops = self.generate_o2m_value();
                new instance.web.Model("hr.analytic.timesheet").call("on_change_account_id", [[], id]).then(function (res) {
                    var def = _.extend({}, self.default_get, res.value, {
                        name: self.description_line,
                        unit_amount: 0,
                        date: instance.web.date_to_str(self.dates[0]),
                        account_id: id,
                        customer: self.task_m2o.get_value(),
                    });
                    ops.push(def);
                    self.set({"sheets": ops});
                });
            });
        },

        get_box: function (account, day_count) {
            return this.$('[data-account-task="' + account.account_task + '"][data-day-count="' + day_count + '"]');
        },
        get_total: function (account) {
            return this.$('[data-account-task-total="' + account.account_task + '"]');
        },
    });
};

      

+3


source to share





All Articles