diff --git a/sao/src/model.js b/sao/src/model.js index 524a26a81b..523df88920 100644 --- a/sao/src/model.js +++ b/sao/src/model.js @@ -513,11 +513,14 @@ } else { cmp = function(a, b) { return a < b; }; } + let max_id = Math.max(0, ...this.map((r) => r.id)); for (const record of this) { if (record.get_loaded([field]) || changed || record.id < 0) { + let prev_id = null; if (prev) { prev.load(field, false); index = prev.field_get(field); + prev_id = prev.id >= 0 ? prev.id : max_id++; } else { index = null; } @@ -528,7 +531,7 @@ update = true; } else if (prev) { if (record.id >= 0) { - update = cmp(record.id, prev.id); + update = cmp(record.id, prev_id); } else if (position === 0) { update = true; } @@ -536,7 +539,7 @@ } else if (value === index) { if (prev) { if (record.id >= 0) { - update = cmp(record.id, prev.id); + update = cmp(record.id, prev_id); } else if (position === 0) { update = true; } diff --git a/tryton/tryton/gui/window/view_form/model/group.py b/tryton/tryton/gui/window/view_form/model/group.py index ab9d431108..f125620fb5 100644 --- a/tryton/tryton/gui/window/view_form/model/group.py +++ b/tryton/tryton/gui/window/view_form/model/group.py @@ -345,12 +345,18 @@ class Group(list): cmp = operator.gt else: cmp = operator.lt + max_id = max(0, *(r.id for r in self)) for record in self: # Assume not loaded records are correctly ordered # as far as we do not change any previous records. if record.get_loaded([field]) or changed or record.id < 0: if prev: index = prev[field].get(prev) + if prev.id >= 0: + prev_id = prev.id + else: + max_id += 1 + prev_id = max_id else: index = None update = False @@ -360,13 +366,13 @@ class Group(list): update = True elif prev: if record.id >= 0: - update = cmp(record.id, prev.id) + update = cmp(record.id, prev_id) elif position == 0: update = True elif value == index: if prev: if record.id >= 0: - update = cmp(record.id, prev.id) + update = cmp(record.id, prev_id) elif position == 0: update = True elif value <= (index or 0):