Store any selection in selection mixin to compute textual value

Since 917de1b3e124 the current selection is no more stored but it is needed to
render textual value of a column synchronously.

Closes #15104
This commit is contained in:
Cédric Krier
2026-09-17 16:18:47 +02:00
parent d9c59a242d
commit 548226de8e
2 changed files with 25 additions and 30 deletions
+10 -2
View File
@@ -776,6 +776,7 @@
Sao.common.selection_mixin = {};
Sao.common.selection_mixin.init = function() {
this.inactive_selection = [];
this.any_selection = {}
this._values2selection = {};
this._domain_cache = {};
if (this.nullable_widget === undefined) {
@@ -800,6 +801,7 @@
});
}
let help = this.attributes.help_selection || {};
Object.assign(this.any_selection, Object.fromEntries(selection));
if (callback) callback(selection, help);
};
if (!(selection instanceof Array) &&
@@ -848,6 +850,9 @@
selection = Sao.common.selection_mixin
.filter_selection.call(
this, domain, record, field, selection);
Object.assign(
this.any_selection,
Object.fromEntries(selection));
if (callback) {
callback(selection, help);
}
@@ -888,6 +893,8 @@
}
}
this._domain_cache[jdomain] = [selection, help];
Object.assign(
this.any_selection, Object.fromEntries(selection));
let cur_domain = field.get_domain(record);
let cur_context = field.get_context(record);
@@ -968,8 +975,9 @@
'params': [[value], ['rec_name'], {}]
}, Sao.Session.current_session);
return prm.then(result => {
this.inactive_selection.push([result[0].id, result[0].rec_name]);
return [result[0].id, result[0].rec_name];
let selection = [result[0].id, result[0].rec_name];
this.inactive_selection.push(selection);
return selection;
});
};
+15 -28
View File
@@ -2875,37 +2875,29 @@
return record._values[related];
} else {
var value = this.field.get(record);
for (const option of this.selection) {
if (option[0] === value) {
return option[1];
}
if (Object.hasOwn(this.any_selection, value)) {
return this.any_selection[value];
} else {
return value;
}
return value;
}
},
update_text: function(cell, record) {
if (!this.tree.editable &&
(this.field.name + ':string' in record._values)) {
var text_value = this.get_textual_value(record);
let text_value = record._values[this.field.name + ':string'];
cell.text(text_value).attr('title', text_value);
} else {
this.update_selection(record, (selection, help) => {
var value = this.field.get(record);
var prm, text, found = false;
for (const option of selection) {
if (option[0] === value) {
found = true;
text = option[1];
break;
}
}
if (!found) {
let value = this.field.get(record),
prm;
if (Object.hasOwn(this.any_selection, value)) {
prm = jQuery.when(this.any_selection[value]);
} else {
prm = Sao.common.selection_mixin.get_inactive_selection
.call(this, value).then(function(inactive) {
return inactive[1];
});
} else {
prm = jQuery.when(text);
}
prm.done(text_value => {
cell.text(text_value).attr('title', text_value);
@@ -2936,10 +2928,8 @@
return record._values[related];
} else {
var values = this.field.get_eval(record).map(value => {
for (const option of this.selection) {
if (option[0] === value) {
return option[1];
}
if (Object.hasOwn(this.any_selection, value)) {
return this.any_selection[value];
}
return '';
});
@@ -2949,7 +2939,7 @@
update_text: function(cell, record) {
if (!this.tree.editable &&
(this.field_name + ':string' in record._values)) {
var text_value = this.get_textual_value(record);
let text_value = record._values[this.field_name + ':string'];
cell.text(text_value).attr('title', text_value);
} else {
this.update_selection(record, () => {
@@ -2995,11 +2985,8 @@
name = value[1];
}
if (model) {
for (const option of this.selection) {
if (option[0] === model) {
model = option[1];
break;
}
if (Object.hasOwn(this.any_selection, model)) {
model = this.any_selection[model];
}
text = model + ',' + name;
} else {