tryton-sao 6.0.58 → 6.0.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG CHANGED
@@ -1,4 +1,14 @@
1
1
 
2
+ Version 6.0.60 - 2025-05-15
3
+ ---------------------------
4
+ * Bug fixes (see mercurial logs for details)
5
+
6
+
7
+ Version 6.0.59 - 2025-05-02
8
+ ---------------------------
9
+ * Bug fixes (see mercurial logs for details)
10
+
11
+
2
12
  Version 6.0.58 - 2025-04-26
3
13
  ---------------------------
4
14
  * Bug fixes (see mercurial logs for details)
@@ -4926,6 +4926,15 @@ var Sao = {};
4926
4926
  if (!context) {
4927
4927
  context = {};
4928
4928
  }
4929
+ function atof(string) {
4930
+ if (!string) {
4931
+ throw("empty string");
4932
+ }
4933
+ let { format } = new Intl.NumberFormat(
4934
+ Sao.i18n.BC47(Sao.i18n.getlang()));
4935
+ let [, decimalSign] = /^0(.)1$/.exec(format(0.1));
4936
+ return Number(string.replace(decimalSign, '.'));
4937
+ }
4929
4938
  var convert_selection = function() {
4930
4939
  if (typeof value == 'string') {
4931
4940
  for (var i = 0; i < field.selection.length; i++) {
@@ -4957,8 +4966,12 @@ var Sao = {};
4957
4966
  },
4958
4967
  'float': function() {
4959
4968
  var factor = Number(field.factor || 1);
4960
- var result = Number(value);
4961
- if (isNaN(result) || value === '' || value === null) {
4969
+ try {
4970
+ var result = atof(value);
4971
+ } catch (e) {
4972
+ return null;
4973
+ }
4974
+ if (isNaN(result)) {
4962
4975
  return null;
4963
4976
  } else {
4964
4977
  return result / factor;
@@ -4966,18 +4979,25 @@ var Sao = {};
4966
4979
  },
4967
4980
  'integer': function() {
4968
4981
  var factor = Number(field.factor || 1, 10);
4969
- var result = parseInt(value, 10);
4982
+ try {
4983
+ var result = atof(value);
4984
+ } catch (e) {
4985
+ return null;
4986
+ }
4970
4987
  if (isNaN(result)) {
4971
4988
  return null;
4972
4989
  } else {
4973
- return result / factor;
4990
+ return parseInt(result / factor, 10);
4974
4991
  }
4975
4992
  },
4976
4993
  'numeric': function() {
4977
4994
  var factor = Number(field.factor || 1);
4978
- var result = Number(value);
4979
- if (isNaN(result.valueOf()) ||
4980
- value === '' || value === null) {
4995
+ try {
4996
+ var result = atof(value);
4997
+ } catch (e) {
4998
+ return null;
4999
+ }
5000
+ if (isNaN(result)) {
4981
5001
  return null;
4982
5002
  } else {
4983
5003
  return new Sao.Decimal(result / factor);
@@ -5041,8 +5061,7 @@ var Sao = {};
5041
5061
  return '';
5042
5062
  }
5043
5063
  var digit = 0;
5044
- var factor = Number(field.factor || 1);
5045
- var string = String(value * factor);
5064
+ var string = String(value);
5046
5065
  if (string.contains('e')) {
5047
5066
  var exp = string.split('e')[1];
5048
5067
  string = string.split('e')[0];
@@ -5051,7 +5070,14 @@ var Sao = {};
5051
5070
  if (string.contains('.')) {
5052
5071
  digit += string.replace(/0+$/, '').split('.')[1].length;
5053
5072
  }
5054
- return (value * factor).toFixed(digit);
5073
+ var factor = Number(field.factor || 1);
5074
+ digit -= Math.round(Math.log10(factor));
5075
+ return (value * factor).toLocaleString(
5076
+ Sao.i18n.BC47(Sao.i18n.getlang()), {
5077
+ useGrouping: true,
5078
+ minimumFractionDigits: digit,
5079
+ maximumFractionDigits: digit,
5080
+ });
5055
5081
  };
5056
5082
  var format_selection = function() {
5057
5083
  if (field.selection instanceof Array) {
@@ -9503,6 +9529,7 @@ var Sao = {};
9503
9529
  }
9504
9530
 
9505
9531
  if (value && (value.add || value.update)) {
9532
+ let vals_to_set = {};
9506
9533
  // First set already added fields to prevent triggering a
9507
9534
  // second on_change call
9508
9535
  if (value.update) {
@@ -9512,9 +9539,9 @@ var Sao = {};
9512
9539
  }
9513
9540
  var record2 = group.get(vals.id);
9514
9541
  if (record2) {
9515
- var vals_to_set = {};
9516
9542
  for (var key in vals) {
9517
- if (!(key in new_field_names)) {
9543
+ if (!Object.prototype.hasOwnProperty.call(
9544
+ new_field_names, key)) {
9518
9545
  vals_to_set[key] = vals[key];
9519
9546
  }
9520
9547
  }
@@ -9548,7 +9575,14 @@ var Sao = {};
9548
9575
  }
9549
9576
  var record2 = group.get(vals.id);
9550
9577
  if (record2) {
9551
- record2.set_on_change(vals);
9578
+ let to_update = Object.fromEntries(
9579
+ Object.entries(vals).filter(
9580
+ ([k, v]) => {
9581
+ !Object.prototype.hasOwnProperty.call(
9582
+ vals_to_set, k)
9583
+ }
9584
+ ));
9585
+ record2.set_on_change(to_update);
9552
9586
  }
9553
9587
  });
9554
9588
  }
@@ -10767,15 +10801,20 @@ var Sao = {};
10767
10801
  case 'ok':
10768
10802
  return this.save();
10769
10803
  case 'ko':
10770
- var record_id = this.screen.current_record.id;
10804
+ var record_id = null;
10805
+ if (this.screen.current_record) {
10806
+ record_id = this.screen.current_record.id;
10807
+ }
10771
10808
  return this.reload(false).then(function() {
10772
- if (record_id < 0) {
10773
- return jQuery.Deferred().reject(true);
10774
- }
10775
- else if (this.screen.current_record) {
10776
- if (record_id !=
10777
- this.screen.current_record.id) {
10778
- return jQuery.Deferred().reject();
10809
+ if (record_id !== null) {
10810
+ if (record_id < 0) {
10811
+ return jQuery.Deferred().reject(true);
10812
+ }
10813
+ else if (this.screen.current_record) {
10814
+ if (record_id !=
10815
+ this.screen.current_record.id) {
10816
+ return jQuery.Deferred().reject();
10817
+ }
10779
10818
  }
10780
10819
  }
10781
10820
  }.bind(this));
@@ -12307,7 +12346,7 @@ var Sao = {};
12307
12346
  Sao.ScreenContainer.BetweenDates._super.init.call(this, id);
12308
12347
  this.from.change(this._from_changed.bind(this));
12309
12348
  },
12310
- _get_value: function(entry, value) {
12349
+ _get_value: function(entry) {
12311
12350
  return entry.find('input[type=text]').val();
12312
12351
  },
12313
12352
  _set_value: function(entry, value) {
@@ -12420,11 +12459,17 @@ var Sao = {};
12420
12459
  'class': 'form-control input-sm',
12421
12460
  'type': 'number',
12422
12461
  'step': 'any',
12462
+ 'lang': Sao.i18n.getlang(),
12423
12463
  }).appendTo(el);
12424
12464
  return entry;
12425
12465
  },
12426
- _get_value: function(entry, value) {
12427
- return entry.val();
12466
+ _get_value: function(entry) {
12467
+ let value = entry.val();
12468
+ if (value) {
12469
+ value = Number(value).toLocaleString(
12470
+ Sao.i18n.BC47(Sao.i18n.getlang()))
12471
+ }
12472
+ return value;
12428
12473
  },
12429
12474
  _set_value: function(entry, value) {
12430
12475
  return entry.val(value);
@@ -20114,7 +20159,8 @@ function eval_pyson(value){
20114
20159
  'class': 'btn btn-default btn-block',
20115
20160
  'type': 'button'
20116
20161
  }).text(Sao.i18n.gettext('More')
20117
- ).click(function() {
20162
+ ).one('click', function() {
20163
+ this.tbody.find('tr.more-row').remove();
20118
20164
  var height = this.table.height();
20119
20165
  this.display_size += Sao.config.display_size;
20120
20166
  this.display();