From cfcba0d07b1599a99891129092a5e75407445fae Mon Sep 17 00:00:00 2001
From: Rafael Monnerat <rafael@nexedi.com>
Date: Wed, 18 Mar 2015 20:04:40 +0000
Subject: [PATCH] slapos_web: Reimplement using declareService for setup
 loopEventListener

- Reorganise the code to be renderjs and gadget field friendly
---
 .../rjs_gadget_slapos_parameter_form_html.xml |   6 +-
 .../rjs_gadget_slapos_request_form_html.xml   |  13 +-
 .../rjs_slapos_load_schema_js.xml             |  71 ++++++---
 .../rjs_slapos_parameter_form_js.xml          | 135 +++++++++++-------
 .../rjs_slapos_request_form_js.xml            |  33 +++--
 5 files changed, 168 insertions(+), 90 deletions(-)

diff --git a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_parameter_form_html.xml b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_parameter_form_html.xml
index aec3f3a1d..8f289901a 100644
--- a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_parameter_form_html.xml
+++ b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_parameter_form_html.xml
@@ -132,7 +132,7 @@
           <fieldset id="parameter-main"> </fieldset>\n
           <fieldset id="parameter-optional"> </fieldset>\n
           <fieldset id="parameter-xml"> \n
-            <input type=hidden name="field_your_instance_xml" class="parameter_xml_output"></input>\n
+            <input type=hidden name="parameter_hash" class="parameter_hash_output"></input>\n
           </fieldset>\n
           \n
       </div>\n
@@ -278,7 +278,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>941.46746.34379.16640</string> </value>
+                <value> <string>941.48617.25119.44288</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -296,7 +296,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1426586570.59</float>
+                        <float>1426700926.65</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_request_form_html.xml b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_request_form_html.xml
index e874b4a61..7ca89f97b 100644
--- a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_request_form_html.xml
+++ b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_gadget_slapos_request_form_html.xml
@@ -110,7 +110,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1">\n
     <title>ERP5</title>\n
     <link rel="shortcut icon" href="favicon.ico">\n
-    <script src="../RSVP.js" type="text/javascript"></script>\n
+    <script src="RSVP.js" type="text/javascript"></script>\n
     <script src="../renderjs.js" type="text/javascript"></script>\n
     <script src="jquery.js" type="text/javascript"></script>\n
     <script src="slapos_request_form.js" type="text/javascript"></script>\n
@@ -118,9 +118,10 @@
   </head>\n
     <body>\n
       <div>\n
-        <div class="parameter" \n
-             data-gadget-url="gadget_slapos_parameter_form.html"\n
-             data-gadget-scope="parameter">\n
+        <div class="parameter">\n
+          <div class="loading-parameter-form">\n
+            <p><img src="ERP5VCS_imgs/wait.gif"></p>\n
+          </div>\n
         </div>\n
 \n
         <div class="debug"></div>\n
@@ -264,7 +265,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>941.38508.45475.9659</string> </value>
+                <value> <string>941.48619.34818.36147</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -282,7 +283,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1426092321.48</float>
+                        <float>1426699039.61</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_load_schema_js.xml b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_load_schema_js.xml
index 380ff1798..4346a07a6 100644
--- a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_load_schema_js.xml
+++ b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_load_schema_js.xml
@@ -103,17 +103,26 @@
 
 /*jslint nomen: true, maxlen: 200, indent: 2*/\n
 /*global window, rJS, console, RSVP, jQuery, jIO, tv4, URI, JSON, $ */\n
-(function (window, rJS, $, URI, RSVP) {\n
+(function (window, rJS, $, RSVP) {\n
   "use strict";\n
 \n
   var gk = rJS(window);\n
 \n
   function getJSON(url) {\n
-    return jIO.util.ajax({\n
-      url: url\n
-    })\n
-      .then(function (evt) {\n
-        return evt.target.responseText;\n
+    var protocol = URI(url).protocol(); \n
+    if ( protocol === "http" || protocol === "https" ) { \n
+      if (URI(window.location).protocol() !==  protocol) {\n
+        throw new Error("You cannot mixed http and https calls");\n
+      }\n
+    }\n
+    return RSVP.Queue()\n
+      .push(function () { \n
+        return jIO.util.ajax({\n
+          url: url\n
+        })\n
+        .then(function (evt) {\n
+          return evt.target.responseText;\n
+        });\n
       });\n
   }\n
 \n
@@ -278,13 +287,13 @@
 \n
   function validateJSONSchema(json, base_url) {\n
     return getMetaJSONSchema()\n
-      .then(function (meta_schema) {\n
+      .push(function (meta_schema) {\n
         if (!tv4.validate(json, meta_schema)) {\n
           throw new Error("Non valid JSON schema " + json);\n
         }\n
         return JSON.parse(json);\n
       })\n
-      .then(function (schema) {\n
+      .push(function (schema) {\n
         return expandSchema(schema, schema, base_url);\n
       });\n
   }\n
@@ -292,31 +301,36 @@
   gk\n
     .declareMethod("loadJSONSchema", function (url) {\n
       return getJSON(url)\n
-        .then(function (json) {\n
+        .push(function (json) {\n
           var base_url, url_uri;\n
 \n
           url_uri = URI(url);\n
           base_url = url_uri.path().split("/");\n
           base_url.pop();\n
           base_url = url.split(url_uri.path())[0] + base_url.join("/");\n
-\n
+          \n
           return validateJSONSchema(json, base_url);\n
         });\n
     })\n
 \n
     .declareMethod("loadSoftwareJSON", function (url) {\n
       return getJSON(url)\n
-        .then(function (json) {\n
+        .push(function (json) {\n
           return JSON.parse(json);\n
         });\n
     })\n
 \n
     .declareMethod("validateJSONForSoftwareType", function (schema_url, software_type, generated_json) {\n
       return getJSON(schema_url)\n
-        .then(function (json) {\n
+        .push(function (json) {\n
           return JSON.parse(json);\n
-        }).then(function (json_object) {\n
-          var parameter_schema_url, st;\n
+        })\n
+        .push(function (json_object) {\n
+          var parameter_schema_url,\n
+            st,\n
+            base_url,\n
+            url_uri = URI(schema_url);\n
+        \n
           for (st in json_object["software-type"]) {\n
             if (json_object["software-type"].hasOwnProperty(st)) {\n
               if (st === software_type) {\n
@@ -324,16 +338,31 @@
               }\n
             }\n
           }\n
+          \n
+          if (URI(parameter_schema_url).protocol() === "") {\n
+            base_url = url_uri.path().split("/");\n
+            base_url.pop();\n
+            base_url = schema_url.split(url_uri.path())[0] + base_url.join("/");\n
+            if (base_url !== undefined) {\n
+              parameter_schema_url = base_url + "/" + parameter_schema_url;\n
+            }\n
+          }\n
+          \n
           return getJSON(parameter_schema_url)\n
-            .then(function (json) {\n
-              return tv4.validateMultiple(generated_json, JSON.parse(json));\n
+            .push(function (json) {\n
+              var schema = JSON.parse(json);\n
+\n
+              return expandSchema(schema, schema, base_url)\n
+                .push(function (loaded_json) {\n
+                  return tv4.validateMultiple(generated_json, loaded_json);\n
+                });\n
             });\n
-        });\n
+         });\n
     })\n
 \n
     .declareMethod("validateJSON", function (schema_url, generated_json) {\n
       return getJSON(schema_url)\n
-        .then(function (json) {\n
+        .push(function (json) {\n
           var base_url,\n
             url_uri = URI(schema_url),\n
             schema = JSON.parse(json);\n
@@ -349,7 +378,7 @@
         });\n
     });\n
 \n
-}(window, rJS, $, RSVP, URI));
+}(window, rJS, $, RSVP));
 
 ]]></string> </value>
         </item>
@@ -486,7 +515,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>941.46927.41646.58504</string> </value>
+                <value> <string>941.48697.33489.29337</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -504,7 +533,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1426597461.76</float>
+                        <float>1426706745.9</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_parameter_form_js.xml b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_parameter_form_js.xml
index 57627d70c..cfb7c8b6e 100644
--- a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_parameter_form_js.xml
+++ b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_parameter_form_js.xml
@@ -197,18 +197,34 @@
   function validateForm(gadget, json_url) {\n
     return gadget.processValidation(json_url);\n
   }\n
+\n
+  function loadEventList(gadget) {\n
+      var g = gadget,\n
+        field_list = g.props.element.querySelectorAll(".slapos-parameter"), \n
+        input_index,\n
+        promise_list = [];\n
+\n
+      console.log("INITIATING A LOOP EVENT LISTENER");\n
+\n
+      for (input_index = 0; input_index < field_list.length; input_index++) {\n
+        console.log(input_index);\n
+        promise_list.push(loopEventListener(\n
+          field_list[input_index],\n
+          \'change\',\n
+          false,\n
+          validateForm.bind(g, g, g.options.json_url)\n
+          ));\n
+        }\n
+      return RSVP.all(promise_list);\n
+  }\n
   \n
-  function submitForm(gadget, json_url) {\n
-    return gadget.processValidation(json_url);\n
+  function getSoftwareTypeFromForm(element) {\n
+    var software_type;\n
+    $(element.querySelectorAll(".slapos-software-type")).each(function (key, input) {\n
+      software_type = input.value;\n
+    });\n
+    return software_type;\n
   }\n
-\n
-  //function getSoftwareTypeFromForm(element) {\n
-  //  var software_type;\n
-  //  $(element.querySelectorAll(".slapos-software-type")).each(function (key, input) {\n
-  //    software_type = input.value;\n
-  //  });\n
-  //  return software_type;\n
-  //}\n
 \n
   gk.ready(function (g) {\n
     g.props = {};\n
@@ -217,7 +233,6 @@
         g.props.element = element;\n
       });\n
   })\n
-\n
 \n
     .declareMethod("loadJSONSchema", function (url) {\n
       return this.getDeclaredGadget(\'loadschema\')\n
@@ -226,10 +241,10 @@
         });\n
     })\n
 \n
-    .declareMethod("validateJSON", function (schema_url, generated_json) {\n
+    .declareMethod("validateJSONForSoftwareType", function (schema_url, softwaretype, generated_json) {\n
       return this.getDeclaredGadget(\'loadschema\')\n
         .push(function (gadget) {\n
-          return gadget.validateJSON(schema_url, generated_json);\n
+          return gadget.validateJSONForSoftwareType(schema_url, softwaretype, generated_json);\n
         });\n
     })\n
 \n
@@ -244,18 +259,19 @@
 \n
     .declareMethod(\'processValidation\', function (json_url) {\n
       var g = this,\n
-        // software_type = getSoftwareTypeFromForm(g.props.element),\n
+        software_type = getSoftwareTypeFromForm(g.props.element),\n
         json_dict = getFormValuesAsJSONDict(g.props.element);\n
 \n
-      return g.validateJSON(json_url, json_dict)\n
+      return g.validateJSONForSoftwareType(json_url, software_type, json_dict)\n
         .push(function (validation) {\n
           var error_index,\n
-            parameter_input = g.props.element.querySelectorAll(\'.parameter_xml_output\')[0],\n
+            parameter_hash_input = g.props.element.querySelectorAll(\'.parameter_hash_output\')[0],\n
             field_name,\n
             div,\n
             divm,\n
             missing_index,\n
-            missing_field_name;\n
+            missing_field_name,\n
+            xml_output;\n
 \n
           $(g.props.element.querySelectorAll("span.error")).each(function (i, span) {\n
             span.textContent = "";\n
@@ -265,8 +281,11 @@
             div.setAttribute("class", "");\n
           });\n
 \n
+          xml_output = jsonDictToParameterXML(json_dict);\n
+          parameter_hash_input.value = btoa(xml_output);\n
+          console.log(parameter_hash_input.value);\n
           if (validation.valid) {\n
-            parameter_input.value = jsonDictToParameterXML(json_dict);\n
+            return xml_output;\n
           } else {\n
             for (error_index in validation.errors) {\n
               if (validation.errors.hasOwnProperty(error_index)) {\n
@@ -285,10 +304,8 @@
                 divm.querySelector("span.error").textContent = validation.missing[missing_index].message;\n
               }\n
             }\n
-            parameter_input.value = "ERROR";\n
+            return "ERROR";\n
           }\n
-          console.log(jsonDictToParameterXML(json_dict));\n
-          return false;\n
         });\n
     })\n
 \n
@@ -303,7 +320,7 @@
             input,\n
             div_input,\n
             span_error,\n
-            promise_list = [],\n
+            field_list = [],\n
             span_info,\n
             fieldset_list = g.props.element.querySelectorAll(\'fieldset\'),\n
             fieldset = document.createElement("fieldset"),\n
@@ -329,7 +346,7 @@
                 span_info.textContent = \'(default = \' + json.properties[key].default + \')\';\n
                 div_input.appendChild(span_info);\n
               }\n
-\n
+              field_list.push(input);\n
               span_error = document.createElement("span");\n
               span_error.setAttribute("class", "error");\n
               div_input.appendChild(span_error);\n
@@ -339,25 +356,11 @@
               } else {\n
                 fieldset.appendChild(div);\n
               }\n
-              promise_list.push(loopEventListener(\n
-                input,\n
-                \'change\',\n
-                false,\n
-                validateForm.bind(g, g, json_url)\n
-              ));\n
-              promise_list.push(loopEventListener(\n
-                input,\n
-                \'submit\',\n
-                false,\n
-                submitForm.bind(g, g, json_url)\n
-              ));\n
             }\n
           }\n
           $(fieldset_list[1]).replaceWith(fieldset);\n
           $(fieldset_list[2]).replaceWith(fieldset_optional);\n
-          return RSVP.all(promise_list);\n
-        }).push(function () {\n
-          console.log("LOADED All Promises")\n
+          return field_list;\n
         });\n
     })\n
 \n
@@ -400,16 +403,18 @@
       if (options.json_url === undefined) {\n
         throw new Error("undefined json_url");\n
       }\n
-\n
+      console.log("CALLED RENDER");\n
       var g = this,\n
         softwaretype;\n
+\n
+      this.options = options;\n
 \n
       function updateParameterForm(evt) {\n
         options.parameter.softwaretype = evt.srcElement.value;\n
         return g.render(options);\n
       }\n
 \n
-      return g.loadSoftwareJSON(options.json_url).push(function (json) {\n
+      return g.loadSoftwareJSON(g.options.json_url).push(function (json) {\n
         var option_index,\n
           option,\n
           option_selected = options.parameter.softwaretype,\n
@@ -468,23 +473,49 @@
             prefix = options.json_url.split(json_url_uri.path())[0] + prefix.join("/");\n
             parameter_json_schema_url = prefix + "/" + parameter_json_schema_url;\n
           }\n
-\n
+          console.log("GOING TO RENDER FORM");\n
           return g.renderParameterForm(parameter_json_schema_url, parameter_dict);\n
         })\n
         .push(function () {\n
-          var element = g.props.element.getElementsByTagName(\'select\')[0];\n
-          console.log("INITIATING A LOOP EVENT LISTENER FOR OPTION CHANGE");\n
-          return loopEventListener(\n
-            element,\n
-            \'change\',\n
-            false,\n
-            updateParameterForm.bind(g)\n
-          );\n
+          console.log("FINISHED TO RENDER, RETURNING THE GADGET");\n
+          return g;\n
         })\n
+\n
         .fail(function (error) {\n
+          console.log("FAIL CALLED");\n
           console.error(error.stack);\n
-          return g.renderFailoverTextArea(\'\', error.toString());\n
+          return g.renderFailoverTextArea(\'\', error.toString())\n
+            .push(function() {\n
+              return g;\n
+            });\n
         });\n
+    })\n
+    .declareService(function () {\n
+      var g = this,\n
+       element = g.props.element.getElementsByTagName(\'select\')[0];\n
+\n
+      if (element === undefined) {\n
+        return true;\n
+      }\n
+\n
+      function updateParameterForm(evt) {\n
+        g.options.parameter.softwaretype = evt.srcElement.value;\n
+        return g.render(g.options)\n
+          .push(function () {\n
+            return loadEventList(g);\n
+          });\n
+      }\n
+\n
+      console.log("INITIATING A LOOP EVENT LISTENER FOR OPTION CHANGE");\n
+      return loopEventListener(\n
+            element,\n
+            \'change\',\n
+            false,\n
+            updateParameterForm.bind(g)\n
+        );\n
+    })\n
+    .declareService(function() {\n
+      return loadEventList(this);\n
     });\n
 \n
 }(window, document, rJS, loopEventListener, $, XMLSerializer, jQuery, vkbeautify));
@@ -624,7 +655,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>941.47120.44131.43212</string> </value>
+                <value> <string>941.48752.57599.9267</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -642,7 +673,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1426618698.56</float>
+                        <float>1426707039.92</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
diff --git a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_request_form_js.xml b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_request_form_js.xml
index bed36e560..89158ebdf 100644
--- a/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_request_form_js.xml
+++ b/master/bt5/slapos_web/PathTemplateItem/web_page_module/rjs_slapos_request_form_js.xml
@@ -105,7 +105,21 @@
   "use strict";\n
 \n
   var gk = rJS(window),\n
-    json_url = "sample_schema.json";\n
+    json_url = "sample_schema.json", \n
+    parameter_gadget_url = "gadget_slapos_parameter_form.html";\n
+    \n
+  \n
+  gk.declareMethod(\'getContent\', function () {\n
+    var g = this; \n
+    console.log("hey cousous");\n
+    return g.getDeclaredGadget("parameter")\n
+      .push(function(gadget) {\n
+        return gadget.processValidation(g.options.json_url);\n
+      })\n
+      .push(function (xml_result) {\n
+        return {"field_your_instance_xml": xml_result};\n
+      });\n
+  });\n
 \n
   gk.declareMethod(\'render\', function (options) {\n
 \n
@@ -113,6 +127,8 @@
 \n
     options.json_url = "../../renderjs/slapos_load_schema_software_type.json";\n
     options.parameter = {};\n
+    \n
+    g.options = options;\n
 \n
     if (options.value !== undefined) {\n
       // A JSON where provided via gadgetfield\n
@@ -130,12 +146,13 @@
       options.json_url = options.parameter.json_url;\n
     }\n
 \n
-\n
-    return g.getDeclaredGadget(\'parameter\')\n
+    return g.declareGadget(parameter_gadget_url, {\'scope\': \'parameter\'})\n
       .push(function (gadget) {\n
-        return gadget.render(options).push(function () {\n
-          console.log("FINISH TO LOADED");\n
-        });\n
+        return gadget.render(options);\n
+      }).push(function (gadget) {\n
+        var div = g.__element.querySelector(".parameter");\n
+        $(div).replaceWith(gadget.__element)\n
+        return gadget;\n
       });\n
   });\n
 \n
@@ -274,7 +291,7 @@
             </item>
             <item>
                 <key> <string>serial</string> </key>
-                <value> <string>941.47267.50185.4608</string> </value>
+                <value> <string>941.48482.37552.4164</string> </value>
             </item>
             <item>
                 <key> <string>state</string> </key>
@@ -292,7 +309,7 @@
                     </tuple>
                     <state>
                       <tuple>
-                        <float>1426617885.75</float>
+                        <float>1426698399.78</float>
                         <string>UTC</string>
                       </tuple>
                     </state>
-- 
2.30.9