tryton-sao 7.2.19 → 7.2.20

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,9 @@
1
1
 
2
+ Version 7.2.20 - 2025-05-02
3
+ ---------------------------
4
+ * Bug fixes (see mercurial logs for details)
5
+
6
+
2
7
  Version 7.2.19 - 2025-04-26
3
8
  ---------------------------
4
9
  * Bug fixes (see mercurial logs for details)
@@ -3,7 +3,7 @@
3
3
 
4
4
  /* eslint-disable no-redeclare */
5
5
  var Sao = {
6
- __version__: '7.2.19',
6
+ __version__: '7.2.20',
7
7
  };
8
8
  /* eslint-enable no-redeclare */
9
9
 
@@ -5304,6 +5304,15 @@ var Sao = {
5304
5304
  if (!context) {
5305
5305
  context = {};
5306
5306
  }
5307
+ function atof(string) {
5308
+ if (!string) {
5309
+ throw("empty string");
5310
+ }
5311
+ let { format } = new Intl.NumberFormat(
5312
+ Sao.i18n.BC47(Sao.i18n.getlang()));
5313
+ let [, decimalSign] = /^0(.)1$/.exec(format(0.1));
5314
+ return Number(string.replace(decimalSign, '.'));
5315
+ }
5307
5316
  var convert_selection = function() {
5308
5317
  if (typeof value == 'string') {
5309
5318
  for (var i = 0; i < field.selection.length; i++) {
@@ -5335,8 +5344,12 @@ var Sao = {
5335
5344
  },
5336
5345
  'float': function() {
5337
5346
  var factor = Number(field.factor || 1);
5338
- var result = Number(value);
5339
- if (isNaN(result) || value === '' || value === null) {
5347
+ try {
5348
+ var result = atof(value);
5349
+ } catch (e) {
5350
+ return null;
5351
+ }
5352
+ if (isNaN(result)) {
5340
5353
  return null;
5341
5354
  } else {
5342
5355
  return result / factor;
@@ -5344,18 +5357,25 @@ var Sao = {
5344
5357
  },
5345
5358
  'integer': function() {
5346
5359
  var factor = Number(field.factor || 1, 10);
5347
- var result = parseInt(value, 10);
5360
+ try {
5361
+ var result = atof(value);
5362
+ } catch (e) {
5363
+ return null;
5364
+ }
5348
5365
  if (isNaN(result)) {
5349
5366
  return null;
5350
5367
  } else {
5351
- return result / factor;
5368
+ return parseInt(result / factor, 10);
5352
5369
  }
5353
5370
  },
5354
5371
  'numeric': function() {
5355
5372
  var factor = Number(field.factor || 1);
5356
- var result = Number(value);
5357
- if (isNaN(result.valueOf()) ||
5358
- value === '' || value === null) {
5373
+ try {
5374
+ var result = atof(value);
5375
+ } catch (e) {
5376
+ return null;
5377
+ }
5378
+ if (isNaN(result)) {
5359
5379
  return null;
5360
5380
  } else {
5361
5381
  return new Sao.Decimal(result / factor);
@@ -5410,8 +5430,7 @@ var Sao = {
5410
5430
  return '';
5411
5431
  }
5412
5432
  var digit = 0;
5413
- var factor = Number(field.factor || 1);
5414
- var string = String(value * factor);
5433
+ var string = String(value);
5415
5434
  if (string.contains('e')) {
5416
5435
  var exp = string.split('e')[1];
5417
5436
  string = string.split('e')[0];
@@ -5420,7 +5439,14 @@ var Sao = {
5420
5439
  if (string.contains('.')) {
5421
5440
  digit += string.replace(/0+$/, '').split('.')[1].length;
5422
5441
  }
5423
- return (value * factor).toFixed(digit);
5442
+ var factor = Number(field.factor || 1);
5443
+ digit -= Math.round(Math.log10(factor));
5444
+ return (value * factor).toLocaleString(
5445
+ Sao.i18n.BC47(Sao.i18n.getlang()), {
5446
+ useGrouping: true,
5447
+ minimumFractionDigits: digit,
5448
+ maximumFractionDigits: digit,
5449
+ });
5424
5450
  };
5425
5451
  var format_selection = function() {
5426
5452
  if (field.selection instanceof Array) {
@@ -10176,6 +10202,7 @@ var Sao = {
10176
10202
  }
10177
10203
 
10178
10204
  if (value && (value.add || value.update)) {
10205
+ let vals_to_set = {};
10179
10206
  // First set already added fields to prevent triggering a
10180
10207
  // second on_change call
10181
10208
  if (value.update) {
@@ -10185,9 +10212,9 @@ var Sao = {
10185
10212
  }
10186
10213
  const record2 = group.get(vals.id);
10187
10214
  if (record2) {
10188
- var vals_to_set = {};
10189
10215
  for (var key in vals) {
10190
- if (!(key in new_field_names)) {
10216
+ if (!Object.prototype.hasOwnProperty.call(
10217
+ new_field_names, key)) {
10191
10218
  vals_to_set[key] = vals[key];
10192
10219
  }
10193
10220
  }
@@ -10221,7 +10248,14 @@ var Sao = {
10221
10248
  }
10222
10249
  const record2 = group.get(vals.id);
10223
10250
  if (record2) {
10224
- record2.set_on_change(vals);
10251
+ let to_update = Object.fromEntries(
10252
+ Object.entries(vals).filter(
10253
+ ([k, v]) => {
10254
+ !Object.prototype.hasOwnProperty.call(
10255
+ vals_to_set, k)
10256
+ }
10257
+ ));
10258
+ record2.set_on_change(to_update);
10225
10259
  }
10226
10260
  }
10227
10261
  }
@@ -13007,7 +13041,7 @@ var Sao = {
13007
13041
  Sao.ScreenContainer.BetweenDates._super.init.call(this, id);
13008
13042
  this.from.change(this._from_changed.bind(this));
13009
13043
  },
13010
- _get_value: function(entry, value) {
13044
+ _get_value: function(entry) {
13011
13045
  return entry.find('input[type=text]').val();
13012
13046
  },
13013
13047
  _set_value: function(entry, value) {
@@ -13120,11 +13154,17 @@ var Sao = {
13120
13154
  'class': 'form-control input-sm',
13121
13155
  'type': 'number',
13122
13156
  'step': 'any',
13157
+ 'lang': Sao.i18n.getlang(),
13123
13158
  }).appendTo(el);
13124
13159
  return entry;
13125
13160
  },
13126
- _get_value: function(entry, value) {
13127
- return entry.val();
13161
+ _get_value: function(entry) {
13162
+ let value = entry.val();
13163
+ if (value) {
13164
+ value = Number(value).toLocaleString(
13165
+ Sao.i18n.BC47(Sao.i18n.getlang()))
13166
+ }
13167
+ return value;
13128
13168
  },
13129
13169
  _set_value: function(entry, value) {
13130
13170
  return entry.val(value);
@@ -13678,9 +13718,6 @@ var Sao = {
13678
13718
  return this.__current_record;
13679
13719
  },
13680
13720
  set current_record(record) {
13681
- if ((this.__current_record === record) && record) {
13682
- return;
13683
- }
13684
13721
  this.__current_record = record;
13685
13722
  var pos = null;
13686
13723
  var record_id = null;
@@ -25083,9 +25120,10 @@ function eval_pyson(value){
25083
25120
  });
25084
25121
  },
25085
25122
  clear: function() {
25086
- var kinds = this.el.children().each(
25087
- (i, el) => jQuery(el).data('kind'));
25088
- new Set(kinds).forEach(kind => {
25123
+ let kinds = new Set();
25124
+ this.el.children().each(
25125
+ (i, el) => kinds.add(jQuery(el).data('kind')));
25126
+ kinds.forEach(kind => {
25089
25127
  this.refresh(kind);
25090
25128
  });
25091
25129
  this.__messages.clear();
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "tryton-sao",
3
3
  "title": "sao",
4
4
  "description": "Tryton webclient",
5
- "version": "7.2.19",
5
+ "version": "7.2.20",
6
6
  "homepage": "http://www.tryton.org/",
7
7
  "author": {
8
8
  "name": "Tryton"
package/src/common.js CHANGED
@@ -2008,6 +2008,15 @@
2008
2008
  if (!context) {
2009
2009
  context = {};
2010
2010
  }
2011
+ function atof(string) {
2012
+ if (!string) {
2013
+ throw("empty string");
2014
+ }
2015
+ let { format } = new Intl.NumberFormat(
2016
+ Sao.i18n.BC47(Sao.i18n.getlang()));
2017
+ let [, decimalSign] = /^0(.)1$/.exec(format(0.1));
2018
+ return Number(string.replace(decimalSign, '.'));
2019
+ }
2011
2020
  var convert_selection = function() {
2012
2021
  if (typeof value == 'string') {
2013
2022
  for (var i = 0; i < field.selection.length; i++) {
@@ -2039,8 +2048,12 @@
2039
2048
  },
2040
2049
  'float': function() {
2041
2050
  var factor = Number(field.factor || 1);
2042
- var result = Number(value);
2043
- if (isNaN(result) || value === '' || value === null) {
2051
+ try {
2052
+ var result = atof(value);
2053
+ } catch (e) {
2054
+ return null;
2055
+ }
2056
+ if (isNaN(result)) {
2044
2057
  return null;
2045
2058
  } else {
2046
2059
  return result / factor;
@@ -2048,18 +2061,25 @@
2048
2061
  },
2049
2062
  'integer': function() {
2050
2063
  var factor = Number(field.factor || 1, 10);
2051
- var result = parseInt(value, 10);
2064
+ try {
2065
+ var result = atof(value);
2066
+ } catch (e) {
2067
+ return null;
2068
+ }
2052
2069
  if (isNaN(result)) {
2053
2070
  return null;
2054
2071
  } else {
2055
- return result / factor;
2072
+ return parseInt(result / factor, 10);
2056
2073
  }
2057
2074
  },
2058
2075
  'numeric': function() {
2059
2076
  var factor = Number(field.factor || 1);
2060
- var result = Number(value);
2061
- if (isNaN(result.valueOf()) ||
2062
- value === '' || value === null) {
2077
+ try {
2078
+ var result = atof(value);
2079
+ } catch (e) {
2080
+ return null;
2081
+ }
2082
+ if (isNaN(result)) {
2063
2083
  return null;
2064
2084
  } else {
2065
2085
  return new Sao.Decimal(result / factor);
@@ -2114,8 +2134,7 @@
2114
2134
  return '';
2115
2135
  }
2116
2136
  var digit = 0;
2117
- var factor = Number(field.factor || 1);
2118
- var string = String(value * factor);
2137
+ var string = String(value);
2119
2138
  if (string.contains('e')) {
2120
2139
  var exp = string.split('e')[1];
2121
2140
  string = string.split('e')[0];
@@ -2124,7 +2143,14 @@
2124
2143
  if (string.contains('.')) {
2125
2144
  digit += string.replace(/0+$/, '').split('.')[1].length;
2126
2145
  }
2127
- return (value * factor).toFixed(digit);
2146
+ var factor = Number(field.factor || 1);
2147
+ digit -= Math.round(Math.log10(factor));
2148
+ return (value * factor).toLocaleString(
2149
+ Sao.i18n.BC47(Sao.i18n.getlang()), {
2150
+ useGrouping: true,
2151
+ minimumFractionDigits: digit,
2152
+ maximumFractionDigits: digit,
2153
+ });
2128
2154
  };
2129
2155
  var format_selection = function() {
2130
2156
  if (field.selection instanceof Array) {
package/src/model.js CHANGED
@@ -2521,6 +2521,7 @@
2521
2521
  }
2522
2522
 
2523
2523
  if (value && (value.add || value.update)) {
2524
+ let vals_to_set = {};
2524
2525
  // First set already added fields to prevent triggering a
2525
2526
  // second on_change call
2526
2527
  if (value.update) {
@@ -2530,9 +2531,9 @@
2530
2531
  }
2531
2532
  const record2 = group.get(vals.id);
2532
2533
  if (record2) {
2533
- var vals_to_set = {};
2534
2534
  for (var key in vals) {
2535
- if (!(key in new_field_names)) {
2535
+ if (!Object.prototype.hasOwnProperty.call(
2536
+ new_field_names, key)) {
2536
2537
  vals_to_set[key] = vals[key];
2537
2538
  }
2538
2539
  }
@@ -2566,7 +2567,14 @@
2566
2567
  }
2567
2568
  const record2 = group.get(vals.id);
2568
2569
  if (record2) {
2569
- record2.set_on_change(vals);
2570
+ let to_update = Object.fromEntries(
2571
+ Object.entries(vals).filter(
2572
+ ([k, v]) => {
2573
+ !Object.prototype.hasOwnProperty.call(
2574
+ vals_to_set, k)
2575
+ }
2576
+ ));
2577
+ record2.set_on_change(to_update);
2570
2578
  }
2571
2579
  }
2572
2580
  }
package/src/sao.js CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  /* eslint-disable no-redeclare */
5
5
  var Sao = {
6
- __version__: '7.2.19',
6
+ __version__: '7.2.20',
7
7
  };
8
8
  /* eslint-enable no-redeclare */
9
9
 
package/src/screen.js CHANGED
@@ -625,7 +625,7 @@
625
625
  Sao.ScreenContainer.BetweenDates._super.init.call(this, id);
626
626
  this.from.change(this._from_changed.bind(this));
627
627
  },
628
- _get_value: function(entry, value) {
628
+ _get_value: function(entry) {
629
629
  return entry.find('input[type=text]').val();
630
630
  },
631
631
  _set_value: function(entry, value) {
@@ -738,11 +738,17 @@
738
738
  'class': 'form-control input-sm',
739
739
  'type': 'number',
740
740
  'step': 'any',
741
+ 'lang': Sao.i18n.getlang(),
741
742
  }).appendTo(el);
742
743
  return entry;
743
744
  },
744
- _get_value: function(entry, value) {
745
- return entry.val();
745
+ _get_value: function(entry) {
746
+ let value = entry.val();
747
+ if (value) {
748
+ value = Number(value).toLocaleString(
749
+ Sao.i18n.BC47(Sao.i18n.getlang()))
750
+ }
751
+ return value;
746
752
  },
747
753
  _set_value: function(entry, value) {
748
754
  return entry.val(value);
@@ -1296,9 +1302,6 @@
1296
1302
  return this.__current_record;
1297
1303
  },
1298
1304
  set current_record(record) {
1299
- if ((this.__current_record === record) && record) {
1300
- return;
1301
- }
1302
1305
  this.__current_record = record;
1303
1306
  var pos = null;
1304
1307
  var record_id = null;
package/src/window.js CHANGED
@@ -101,9 +101,10 @@
101
101
  });
102
102
  },
103
103
  clear: function() {
104
- var kinds = this.el.children().each(
105
- (i, el) => jQuery(el).data('kind'));
106
- new Set(kinds).forEach(kind => {
104
+ let kinds = new Set();
105
+ this.el.children().each(
106
+ (i, el) => kinds.add(jQuery(el).data('kind')));
107
+ kinds.forEach(kind => {
107
108
  this.refresh(kind);
108
109
  });
109
110
  this.__messages.clear();