[FIX] editable listview @on_write handling in case of @colors

the onwrite handler created an "empty" record with no field value
whatsoever, which'd blow up in the py evaluator. As during creation
(edition of a record where all fields are empty) create a record where
all fields are set to ``false`` so rendering works correctly, and wait
for content refresh to get correct data.

Also added a test for @on_write

bzr revid: xmo@openerp.com-20121112150526-vrr66ms95qbuoped
This commit is contained in:
Xavier Morel 2012-11-12 16:05:26 +01:00
parent d5996402a4
commit 06bcfd27fc
2 changed files with 94 additions and 7 deletions

View File

@ -172,6 +172,22 @@ openerp.web.list_editable = function (instance) {
return self.save_edition();
});
},
/**
* Builds a record with the provided id (``false`` for a creation),
* setting all columns with ``false`` value so code which relies on
* having an actual value behaves correctly
*
* @param {*} id
* @return {instance.web.list.Record}
*/
make_empty_record: function (id) {
var attrs = {id: id};
_(this.columns).chain()
.filter(function (x) { return x.tag === 'field'})
.pluck('name')
.each(function (field) { attrs[field] = false; });
return new instance.web.list.Record(attrs);
},
/**
* Set up the edition of a record of the list view "inline"
*
@ -186,12 +202,7 @@ openerp.web.list_editable = function (instance) {
if (record) {
item = record.attributes;
} else {
var attrs = {id: false};
_(this.columns).chain()
.filter(function (x) { return x.tag === 'field'})
.pluck('name')
.each(function (field) { attrs[field] = false; });
record = new instance.web.list.Record(attrs);
record = this.make_empty_record(false);
this.records.add(record, {
at: this.prepends_on_create() ? 0 : null});
}
@ -391,7 +402,7 @@ openerp.web.list_editable = function (instance) {
if (!record) {
// insert after the source record
var index = this.records.indexOf(source_record) + 1;
record = new instance.web.list.Record({id: id});
record = this.make_empty_record(id);
this.records.add(record, {at: index});
this.dataset.ids.splice(index, 0, id);
}

View File

@ -346,4 +346,80 @@ $(document).ready(function () {
})
.fail(function (e) { ok(false, e && e.message || e); });
});
module('list-edition-onwrite', {
setup: function () {
baseSetup();
}
});
asyncTest('record-to-read', 4, function () {
instance.session.responses['/web/view/load'] = function () {
return {result: {
type: 'tree',
fields: {
a: {type: 'char', string: "A"}
},
arch: {
tag: 'tree',
attrs: { on_write: 'on_write', colors: 'red:a == "foo"' },
children: [
{tag: 'field', attrs: {name: 'a'}}
]
}
}};
};
instance.session.responses['/web/dataset/call_kw:read'] = function (req) {
if (_.isEmpty(req.params.args[0])) {
return {result: []};
} else if (_.isEqual(req.params.args[0], [1])) {
return {result: [
{id: 1, a: 'some value'}
]};
} else if (_.isEqual(req.params.args[0], [42])) {
return {result: [
{id: 42, a: 'foo'}
]};
}
throw new Error(JSON.stringify(req.params));
};
instance.session.responses['/web/dataset/call_kw:default_get'] = function () {
return {result: {}};
};
instance.session.responses['/web/dataset/call_kw:create'] = function () {
return {result: 1};
};
instance.session.responses['/web/dataset/call_kw:on_write'] = function () {
return {result: [42]};
};
var ds = new instance.web.DataSetStatic(null, 'demo', null, []);
var l = new instance.web.ListView({}, ds, false, {editable: 'top'});
l.appendTo($fix)
.then(l.proxy('reload_content'))
.then(function () {
return l.start_edition();
})
.then(function () {
$fix.find('.oe_form_field input').val("some value").change();
})
.then(function () {
return l.save_edition();
})
.always(function () { start(); })
.then(function () {
strictEqual(ds.ids.length, 2,
'should have id of created + on_write');
strictEqual(l.records.length, 2,
'should have record of created + on_write');
strictEqual(
$fix.find('tbody tr:eq(1)').css('color'), 'rgb(255, 0, 0)',
'shoud have color applied');
strictEqual(
$fix.find('tbody tr:eq(2)').css('color'), 'rgb(0, 0, 0)',
'should have default color applied');
}, function (e) {
ok(false, e && e.message || e);
});
});
});