diff --git a/sao/src/model.js b/sao/src/model.js index f9db9c90e9..874a411e45 100644 --- a/sao/src/model.js +++ b/sao/src/model.js @@ -1355,17 +1355,13 @@ } }, get_loaded: function(fields) { - if (!jQuery.isEmptyObject(fields)) { - var result = true; - for (const field of fields) { - if (!(field in this._loaded) && !(field in this.modified_fields)) { - result = false; - } - } - return result; + if (!fields) { + fields = Object.keys(this.model.fields); } - return Sao.common.compare(Object.keys(this.model.fields).sort(), - Object.keys(this._loaded).sort()); + fields = new Set(fields); + var loaded = new Set(Object.keys(this._loaded)); + loaded = loaded.union(new Set(Object.keys(this.modified_fields))); + return fields.isSubsetOf(loaded); }, get root_parent() { var parent = this; diff --git a/sao/src/sao.js b/sao/src/sao.js index 3c3327ca20..afb8cccb09 100644 --- a/sao/src/sao.js +++ b/sao/src/sao.js @@ -136,6 +136,19 @@ var Sao = { } } + if (!Set.prototype.union) { + Set.prototype.union = function(other) { + if (this === null) { + throw new TypeError(); + } + const result = new Set(this); + for (const key of other.keys()) { + result.add(key); + } + return result + } + } + Sao.setdefault = function(object, key, value) { if (!Object.prototype.hasOwnProperty.call(object, key)) { object[key] = value; diff --git a/tryton/tryton/gui/window/view_form/model/record.py b/tryton/tryton/gui/window/view_form/model/record.py index a8fe8185c6..ef1bf3ef0e 100644 --- a/tryton/tryton/gui/window/view_form/model/record.py +++ b/tryton/tryton/gui/window/view_form/model/record.py @@ -303,9 +303,9 @@ class Record: self.reload(fields) def get_loaded(self, fields=None): - if fields: - return set(fields) <= (self._loaded | set(self.modified_fields)) - return set(self.group.fields.keys()) == self._loaded + if fields is None: + fields = self.group.fields.keys() + return set(fields) <= (self._loaded | set(self.modified_fields)) loaded = property(get_loaded)