Commit ee874ba1 authored by Rafael Monnerat's avatar Rafael Monnerat

slapos_jio: Improve failover with mismatched serialization

   Whenever a parameter is incompatible with the serialization (by the use or not of "_" special parameter) the form should display a textarea as a failover.

   Whenever the parameter editor fail to render the form, the selection box (with the software type) shouldn't be hidden, so the user can still change to a proper Software type with a proper serialization (as long it allow you to are requesting an instance and not editing).
parent 3ff4a916
...@@ -667,6 +667,9 @@ ...@@ -667,6 +667,9 @@
div = document.createElement("div"), div = document.createElement("div"),
div_error = document.createElement("div"), div_error = document.createElement("div"),
span_error = document.createElement("span"), span_error = document.createElement("span"),
detail_error = document.createElement("details"),
detail_error_summary = document.createElement("summary"),
detail_error_span = document.createElement("span"),
textarea = document.createElement("textarea"), textarea = document.createElement("textarea"),
fieldset = document.createElement("fieldset"), fieldset = document.createElement("fieldset"),
fieldset_list = g.element.querySelectorAll('fieldset'), fieldset_list = g.element.querySelectorAll('fieldset'),
...@@ -694,16 +697,23 @@ ...@@ -694,16 +697,23 @@
span_error.setAttribute("class", "error"); span_error.setAttribute("class", "error");
span_error.textContent = "Parameter form is not available, use the textarea above for edit the instance parameters."; span_error.textContent = "Parameter form is not available, use the textarea above for edit the instance parameters.";
detail_error_summary.textContent = "More information..."
detail_error_span.setAttribute("class", "error_msg");
detail_error_span.textContent = error;
detail_error.appendChild(detail_error_summary);
detail_error.appendChild(detail_error_span);
div_error.setAttribute("class", "error"); div_error.setAttribute("class", "error");
div.appendChild(textarea); div.appendChild(textarea);
div_error.appendChild(span_error); div_error.appendChild(span_error);
div.appendChild(textarea); div_error.appendChild(detail_error);
fieldset.appendChild(div); fieldset.appendChild(div);
fieldset.appendChild(div_error); fieldset.appendChild(div_error);
fieldset_list[0].innerHTML = ''; // Do not hide the Software type, let the user edit it.
//fieldset_list[0].innerHTML = '';
$(fieldset_list[1]).replaceWith(fieldset); $(fieldset_list[1]).replaceWith(fieldset);
fieldset_list[2].innerHTML = ''; fieldset_list[2].innerHTML = '';
...@@ -907,23 +917,40 @@ ...@@ -907,23 +917,40 @@
return parameter_schema_url.value; return parameter_schema_url.value;
}) })
.push(function (parameter_json_schema_url) { .push(function (parameter_json_schema_url) {
var parameter_dict = {}, json_url_uri, prefix, parameter_entry, var parameter_dict = {}, parameter_list, json_url_uri, prefix, parameter_entry,
restricted_parameter = options.value.parameter.restricted_parameter; restricted_parameter = options.value.parameter.restricted_parameter;
if (options.value.parameter.parameter_xml !== undefined) { if (options.value.parameter.parameter_xml !== undefined) {
if (options.serialisation === "json-in-xml") { if (options.serialisation === "json-in-xml") {
parameter_list = jQuery.parseXML(
options.value.parameter.parameter_xml)
.querySelectorAll("parameter")
if (parameter_list.length > 1) {
throw new Error("The current parameter should contains only _ parameter (json-in-xml).")
}
parameter_entry = jQuery.parseXML( parameter_entry = jQuery.parseXML(
options.value.parameter.parameter_xml options.value.parameter.parameter_xml
).querySelector("parameter[id='_']"); ).querySelector("parameter[id='_']");
if (parameter_entry !== null) { if (parameter_entry !== null) {
parameter_dict = JSON.parse(parameter_entry.textContent); parameter_dict = JSON.parse(parameter_entry.textContent);
} else if (parameter_list.length == 1) {
throw new Error(
"The current parameter should contains only _ parameter (json-in-xml).")
}
} else if (["", "xml"].indexOf(options.serialisation) >= 0) {
parameter_entry = jQuery.parseXML(
options.value.parameter.parameter_xml
).querySelector("parameter[id='_']");
if (parameter_entry !== null) {
throw new Error("The current parameter values should NOT contains _ parameter (xml).");
} }
} else {
$(jQuery.parseXML(options.value.parameter.parameter_xml) $(jQuery.parseXML(options.value.parameter.parameter_xml)
.querySelectorAll("parameter")) .querySelectorAll("parameter"))
.each(function (key, p) { .each(function (key, p) {
parameter_dict[p.id] = p.textContent; parameter_dict[p.id] = p.textContent;
}); });
} else {
throw new Error("Unknown serialisation: " + options.serialisation);
} }
} }
......
...@@ -280,7 +280,7 @@ ...@@ -280,7 +280,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>985.8770.30214.17305</string> </value> <value> <string>999.16034.63838.57002</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -298,7 +298,7 @@ ...@@ -298,7 +298,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1594299230.72</float> <float>1648750934.27</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment