From 819f77ecfadaeef7c9a83a0b36a95351a7e7c411 Mon Sep 17 00:00:00 2001
From: Tomas Peterka <tomas.peterka@nexedi.com>
Date: Tue, 19 Sep 2017 13:59:34 +0200
Subject: [PATCH] [renderjs_ui] Refactor FloatField

-  Remove field_json.value because that one is never send by ERP5 backend
-  Set comprehensive initial state and avoid sneaking state variables afterwards
-  Handle better NaNs which represent empty numerical value
-  Refactor for shorter and simpler code
-  Rename "percents" -> "percentage" according to coding style guidelines
---
 .../rjs_gadget_erp5_floatfield_js.js          | 58 ++++++++++---------
 .../rjs_gadget_erp5_floatfield_js.xml         |  4 +-
 2 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.js
index 987b2c5aa4..b517f5aea3 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.js
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.js
@@ -5,49 +5,51 @@
 
   rJS(window)
     .setState({
-      tag: 'p',
-      step: 1,
-      type: "number"
+      type: "number",
+      // `step` is used for browser-level validation thus a mandatory value
+      // HTML5 default is 1.0 which is not feasible most of the time thus we
+      // default to over-sufficiently small value
+      step: 0.00000001,
+      required: false,
+      editable: true,
+      hidden: false,
+      name: undefined,
+      title: undefined,
+      value: undefined,
+      text_content: undefined,
+      // `append` is a string to display next to the field (%, currency...)
+      append: undefined
     })
 
     .declareMethod('render', function (options) {
       var field_json = options.field_json || {},
-        value = field_json.value || field_json.default || "",
-        percents = (field_json.input_style || "").endsWith("%"),
+        percentage = (field_json.input_style || "").endsWith("%"),
         state_dict = {
           editable: field_json.editable,
           required: field_json.required,
           name: field_json.key,
           title: field_json.title,
-          precision: field_json.precision,
-          hidden: field_json.hidden
+          precision: window.parseFloat(field_json.precision),
+          hidden: field_json.hidden,
+          // erp5 always put value into "default"
+          value: window.parseFloat(field_json.default)
         };
 
-      // if value is 0.0 we assign empty instead - so we fix it here
-      if (field_json.value !== undefined && field_json.value !== '') {
-        value = field_json.value;
-      } else if (field_json.default !== undefined && field_json.default !== '') {
-        value = field_json.default;
+      if (!window.isNaN(state_dict.precision)) {
+        state_dict.step = Math.pow(10, -state_dict.precision);
+        state_dict.value = state_dict.value.toFixed(state_dict.precision);
       }
-      value = window.parseFloat(value); // at this step we finished joggling with value
-
-      if (field_json.precision) {
-        state_dict.step = Math.pow(10, -field_json.precision);
-        value = value.toFixed(field_json.precision);
-      } else {
-        state_dict.step = 0.00000001;
-      }
-      if (percents) {
-        // ERP5 always devides the value by 10 if it is set to pe percentages
+      if (percentage) {
+        // ERP5 always devides the value by 100 if it is set to pe percentages
         // thus we have to mitigate that in javascript here
-        value *= 100.0;
+        state_dict.value *= 100.0;
         state_dict.append = "%";
       }
-      state_dict.value = value;
-      if (window.isNaN(value)) {
-        state_dict.text_content = "";
+
+      if (window.isNaN(state_dict.value)) {
+        state_dict.text_content = "";  // show empty value insted of ugly "NaN"
       } else {
-        state_dict.text_content = value.toString();
+        state_dict.text_content = state_dict.value.toString();
       }
       return this.changeState(state_dict);
     })
@@ -102,4 +104,4 @@
       return true;
     });
 
-}(window, rJS, Math));
+}(window, rJS, Math));
\ No newline at end of file
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.xml
index d4ab8ee154..db8fc7ca56 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.xml
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_floatfield_js.xml
@@ -230,7 +230,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>961.41941.4473.55415</string> </value>
+                <value> <string>962.12584.16558.54920</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -248,7 +248,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1503645555.71</float>
+                        <float>1505816402.11</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
-- 
2.30.9