Skip to Content
Menu
This question has been flagged

i need to use onchange fucntion in JavaScript widget

i have 2 fields in a javascript widget 1st(account which refer to contracts) and 2nd(task which refer to customers) and i want to use onchange between them

i want to change account field based on task field ,, that when i choose customer it should load only contracts of that customer only

anyone face that before ? could you give me examples ?


here is my 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's 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 + '"]');
},
});
};



Avatar
Discard
Author Best Answer


Here is what i add but didn't work i don't know why!


self.task_m2o.change(function () {
alert("Here is the change")
var task_id = self.task_m2o.get_value();
if (task_id === false) {
return;
}
self.account_m2o.init(self.dfm, {
attrs: {
name: "account",
type: "many2one",
domain: [
['type', 'in', ['normal', 'contract']],
['use_timesheets', '=', 1],
['partner_id', '=', task_id]
],
context: {
default_use_timesheets: 1,
default_type: "contract",
default_partner_id: self.task_m2o.value,
},
modifiers: '{"required": true}',
},
});
// reset value previously selected
self.account_m2o.set_value(false);
self.account_m2o.render_value();
});



Avatar
Discard
Related Posts Replies Views Activity
1
Dec 22
2707
0
Dec 20
50
0
Dec 15
12178
2
Aug 24
5000
1
Jan 23
3921