From 157c669d9fcf3c8555442fe53e5639a9b43bd2be Mon Sep 17 00:00:00 2001
From: Romain Courteaud <romain@nexedi.com>
Date: Mon, 17 Oct 2016 09:48:27 +0000
Subject: [PATCH] [erp5_web_renderjs_ui] Rewrite integer field

---
 .../rjs_gadget_erp5_integerfield_html.html    |   5 +-
 .../rjs_gadget_erp5_integerfield_html.xml     |   6 +-
 .../rjs_gadget_erp5_integerfield_js.js        | 141 ++++++++----------
 .../rjs_gadget_erp5_integerfield_js.xml       |   4 +-
 .../rjs_gadget_html5_input_js.js              |   6 +-
 .../rjs_gadget_html5_input_js.xml             |   4 +-
 6 files changed, 76 insertions(+), 90 deletions(-)

diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.html b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.html
index fa9c0a1a03..12aa0d4681 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.html
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.html
@@ -3,18 +3,15 @@
   <head>
     <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
     <meta name="viewport" content="width=device-width, user-scalable=no" />
-    <title>ERP5 Floatfield</title>
+    <title>ERP5 Integerfield</title>
 
     <!-- renderjs -->
     <script src="rsvp.js" type="text/javascript"></script>
     <script src="renderjs.js" type="text/javascript"></script>
-    
     <!-- custom script -->
-    <script src="gadget_global.js" type="text/javascript"></script>
     <script src="gadget_erp5_field_integer.js" type="text/javascript"></script>
 
   </head>
   <body>
-   <input type="number" step="1"/>
   </body>
 </html>
\ No newline at end of file
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.xml
index 19173ed999..659e4dce51 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.xml
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_html.xml
@@ -220,7 +220,7 @@
             </item>
             <item>
                 <key> <string>actor</string> </key>
-                <value> <string>xiaowu</string> </value>
+                <value> <string>zope</string> </value>
             </item>
             <item>
                 <key> <string>comment</string> </key>
@@ -234,7 +234,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>940.60742.34496.36488</string> </value>
+                <value> <string>954.42877.47511.36096</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -252,7 +252,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1423754455.46</float>
+                        <float>1476697183.42</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.js
index 6b00c64493..4c5b4ec6e9 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.js
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.js
@@ -1,97 +1,82 @@
-/*global window, rJS, RSVP, loopEventListener */
+/*global window, rJS */
 /*jslint indent: 2, maxerr: 3 */
-(function (window, rJS, RSVP, loopEventListener) {
+(function (window, rJS) {
   "use strict";
 
   rJS(window)
-    .ready(function (gadget) {
-      return gadget.getElement()
-        .push(function (element) {
-          gadget.element = element;
-        });
-    })
-    .declareAcquiredMethod("notifyValid", "notifyValid")
-    .declareAcquiredMethod("notifyInvalid", "notifyInvalid")
-    .declareAcquiredMethod("notifyChange", "notifyChange")
-    .declareMethod('getTextContent', function () {
-      return this.element.querySelector('input').getAttribute('value');
+    .setState({
+      tag: 'p',
+      step: 1,
+      type: "number"
     })
+
     .declareMethod('render', function (options) {
-      var input = this.element.querySelector('input'),
-        field_json = options.field_json || {};
-      input.setAttribute(
-        'value',
-        field_json.value || field_json.default || ""
-      );
-      input.setAttribute('name', field_json.key);
-      input.setAttribute('title', field_json.title);
-      if (field_json.required === 1) {
-        input.setAttribute('required', 'required');
-      }
-      if (field_json.editable !== 1) {
-        input.setAttribute('readonly', 'readonly');
-        input.setAttribute('data-wrapper-class', 'ui-state-disabled ui-state-readonly');
-        input.setAttribute('disabled', 'disabled');
+      var field_json = options.field_json || {},
+        state_dict = {
+          value: field_json.value || field_json.default || "",
+          editable: field_json.editable,
+          required: field_json.required,
+          name: field_json.key,
+          title: field_json.title
+        };
+      state_dict.text_content = state_dict.value;
+      return this.changeState(state_dict);
+    })
 
+    .onStateChange(function (modification_dict) {
+      var element = this.element,
+        gadget = this,
+        url,
+        result;
+      if (modification_dict.hasOwnProperty('editable')) {
+        if (gadget.state.editable) {
+          url = 'gadget_html5_input.html';
+        } else {
+          url = 'gadget_html5_element.html';
+        }
+        result = this.declareGadget(url, {scope: 'sub'})
+          .push(function (input) {
+            // Clear first to DOM, append after to reduce flickering/manip
+            while (element.firstChild) {
+              element.removeChild(element.firstChild);
+            }
+            element.appendChild(input.element);
+            return input;
+          });
+      } else {
+        result = this.getDeclaredGadget('sub');
       }
+      return result
+        .push(function (input) {
+          return input.render(gadget.state);
+        });
     })
+
     .declareMethod('getContent', function () {
-      var input = this.element.querySelector('input'),
-        result = {};
-      result[input.getAttribute('name')] = input.value;
-      return result;
-    })
-    .declareMethod('checkValidity', function () {
-      var result;
-      result = this.element.querySelector('input').checkValidity();
-      if (result) {
-        return this.notifyValid()
-          .push(function () {
-            return result;
+      if (this.state.editable) {
+        return this.getDeclaredGadget('sub')
+          .push(function (gadget) {
+            return gadget.getContent();
           });
       }
-      return result;
+      return {};
     })
 
-    .declareService(function () {
-      ////////////////////////////////////
-      // Check field validity when the value changes
-      ////////////////////////////////////
-      var field_gadget = this;
-
-      function notifyChange() {
-        return RSVP.all([
-          field_gadget.checkValidity(),
-          field_gadget.notifyChange()
-        ]);
-      }
-
-      // Listen to input change
-      return loopEventListener(
-        field_gadget.element.querySelector('input'),
-        'change',
-        false,
-        notifyChange
-      );
+    .declareMethod('getTextContent', function () {
+      return this.getDeclaredGadget('sub')
+        .push(function (gadget) {
+          return gadget.getTextContent();
+        });
     })
 
-    .declareService(function () {
-      ////////////////////////////////////
-      // Inform when the field input is invalid
-      ////////////////////////////////////
-      var field_gadget = this;
-
-      function notifyInvalid(evt) {
-        return field_gadget.notifyInvalid(evt.target.validationMessage);
+    .declareMethod('checkValidity', function () {
+      if (this.state.editable) {
+        return this.getDeclaredGadget('sub')
+          .push(function (gadget) {
+            return gadget.checkValidity();
+          });
       }
-
-      // Listen to input change
-      return loopEventListener(
-        field_gadget.element.querySelector('input'),
-        'invalid',
-        false,
-        notifyInvalid
-      );
+      return true;
     });
 
-}(window, rJS, RSVP, loopEventListener));
\ No newline at end of file
+}(window, rJS));
\ No newline at end of file
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.xml
index edd56c1754..bcb39c1a85 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.xml
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_integerfield_js.xml
@@ -230,7 +230,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>949.15479.42024.21538</string> </value>
+                <value> <string>954.42915.19295.27187</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -248,7 +248,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1455899193.71</float>
+                        <float>1476697168.98</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.js
index ab299dae17..4e32dc9590 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.js
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.js
@@ -22,7 +22,8 @@
           name: options.name,
           type: options.type || 'text',
           title: options.title,
-          focus: options.focus
+          focus: options.focus,
+          step: options.step
         };
       return this.changeState(state_dict);
     })
@@ -40,6 +41,9 @@
       if (this.state.title) {
         textarea.setAttribute('title', this.state.title);
       }
+      if (this.state.step) {
+        textarea.setAttribute('step', this.state.step);
+      }
 
       if (this.state.required) {
         textarea.required = true;
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.xml
index 83ba72ea85..1136b974eb 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.xml
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_html5_input_js.xml
@@ -230,7 +230,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>954.35751.60338.24780</string> </value>
+                <value> <string>954.35863.52273.29354</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -248,7 +248,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1476274067.85</float>
+                        <float>1476697276.8</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
-- 
2.30.9