Commit 5007a1d5 authored by Tomáš Peterka's avatar Tomáš Peterka

[renderjs_ui] Allow passing `editable` into (embedded) form and let it change fields state

parent 95dea8f5
...@@ -473,6 +473,8 @@ def renderField(traversed_document, field, form_relative_url, value=None, meta_t ...@@ -473,6 +473,8 @@ def renderField(traversed_document, field, form_relative_url, value=None, meta_t
} }
# renderForm mutates `result` therefor no return/assignment # renderForm mutates `result` therefor no return/assignment
renderForm(formbox_context, embeded_form, result['_embedded']['_view'], key_prefix=key) renderForm(formbox_context, embeded_form, result['_embedded']['_view'], key_prefix=key)
# fix editability which is hard-coded to 0 in `renderForm` implementation
result['_embedded']['_view']['form_id']['editable'] = field.get_value("editable")
else: else:
# All other fields are not implemented and we'll return only basic info about them # All other fields are not implemented and we'll return only basic info about them
result = { result = {
......
/*global window, rJS, RSVP, URI */ /*global window, rJS, URI */
/*jslint nomen: true, indent: 2, maxerr: 3 */ /*jslint nomen: true, indent: 2, maxerr: 3 */
(function (window, rJS, RSVP, URI) { /**
* FormBox displays embedded form in itself.
*
* There are two common CSS classes bound to the FormBox Field
* - "horizontal_align_form_box" renders fields without labels in horizontal manner (useful for phone etc.)
* - "invisible" despite its name should only hide label
*
*/
(function (window, rJS, URI) {
"use strict"; "use strict";
rJS(window) rJS(window)
.setState({ .setState({
subgadget_template: null subgadget_template: undefined,
editable: undefined
}) })
.declareAcquiredMethod("jio_getAttachment", "jio_getAttachment") .declareAcquiredMethod("jio_getAttachment", "jio_getAttachment")
...@@ -27,7 +36,12 @@ ...@@ -27,7 +36,12 @@
erp5_form: field_json._embedded erp5_form: field_json._embedded
}; };
if (gadget.state.subgadget_template === null || options.reset === true) { // prefer editability from the global context (form)
if (options.editable !== undefined) {
new_state.editable = options.editable;
}
if (gadget.state.subgadget_template === undefined || options.reset === true) {
// render subgadget only when there is none OR render is explicitely requested // render subgadget only when there is none OR render is explicitely requested
return this.declareGadget('gadget_erp5_page_form.html', {scope: 'sub'}) return this.declareGadget('gadget_erp5_page_form.html', {scope: 'sub'})
.push(function (form_gadget) { .push(function (form_gadget) {
...@@ -54,15 +68,10 @@ ...@@ -54,15 +68,10 @@
}, },
key: gadget.state.name, key: gadget.state.name,
view: gadget.state.view, view: gadget.state.view,
jio_key: erp5_document_uri.segment(2) jio_key: erp5_document_uri.segment(2),
editable: gadget.state.editable
}; };
// XXX: can be uncommented - dunno if it is needed
// if `editable` changes - force reloading of the gadget
// if (modification_dict.hasOwnProperty('editable')) {
// return gadget.render({reset: true});
// }
// do not preserve objects in the state // do not preserve objects in the state
delete gadget.state.erp5_form; delete gadget.state.erp5_form;
...@@ -92,4 +101,4 @@ ...@@ -92,4 +101,4 @@
return true; return true;
}); });
}(window, rJS, RSVP, URI)); }(window, rJS, URI));
\ No newline at end of file \ No newline at end of file
/*jslint nomen: true, indent: 2, maxerr: 3 */ /*jslint nomen: true, indent: 2, maxerr: 3 */
/*global window, document, rJS, RSVP*/ /*global window, document, rJS, RSVP*/
(function (window, document, rJS, RSVP) { (function (window, document, rJS, RSVP) {
"use strict"; "use strict";
/** Form is one of a complicated gadget!
*
* Editability - the form overrides editability of its fields. Editability is
* hard-coded changed either in Page Templates or soft-coded
* changed in FormBox gadget which renders form as a subgadget
**/
function getFieldTypeGadgetUrl(type) { function getFieldTypeGadgetUrl(type) {
var field_url = 'gadget_erp5_field_readonly.html'; var field_url = 'gadget_erp5_field_readonly.html';
...@@ -75,9 +82,10 @@ ...@@ -75,9 +82,10 @@
suboptions.field_json = rendered_field; suboptions.field_json = rendered_field;
suboptions.field_json.view = form_gadget.state.view; suboptions.field_json.view = form_gadget.state.view;
if (group[0] !== "bottom") { // if the whole form is non-editable than every field has to be non-editable
suboptions.label = true; if (form_gadget.state.editable === 0) {
} suboptions.field_json.editable = 0;
}
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
...@@ -179,7 +187,9 @@ ...@@ -179,7 +187,9 @@
form_definition: options.form_definition, form_definition: options.form_definition,
jio_key: options.jio_key, jio_key: options.jio_key,
hash: hash, hash: hash,
view: options.view view: options.view,
editable: options.editable,
title: options.title
}); });
}) })
......
...@@ -77,11 +77,11 @@ ...@@ -77,11 +77,11 @@
erp5_form: undefined, erp5_form: undefined,
url: undefined url: undefined
}; };
if (options.hasOwnProperty('erp5_document')) { if (options.hasOwnProperty('erp5_document')) {
// if we get erp5 document during rendering then no need to fetch it // if we get erp5 document during rendering then no need to fetch it
new_state.erp5_document = options.erp5_document; new_state.erp5_document = options.erp5_document;
// thank you options // remove reference to erp5_document from options (and new_state.options)
delete options.erp5_document; delete options.erp5_document;
} else { } else {
promise_queue promise_queue
...@@ -103,6 +103,13 @@ ...@@ -103,6 +103,13 @@
}); });
} }
// options.editable differs when it comes from the erp5_launcher of FormBox - try to unify it here
if (options.editable === "true" || options.editable === true || options.editable === "1" || options.editable === 1) {
options.editable = 1;
} else {
options.editable = 0;
}
return promise_queue return promise_queue
.push(function () { .push(function () {
var uri = new URI(new_state.erp5_document._embedded._view._links.form_definition.href); var uri = new URI(new_state.erp5_document._embedded._view._links.form_definition.href);
...@@ -111,11 +118,11 @@ ...@@ -111,11 +118,11 @@
.push(function (erp5_form) { .push(function (erp5_form) {
var url = "gadget_erp5_pt_" + erp5_form.pt; var url = "gadget_erp5_pt_" + erp5_form.pt;
// XXX Hardcoded specific behaviour for form_view // XXX Hardcoded specific behaviour for form_view
if ((options.editable !== undefined) && (erp5_form.pt === "form_view")) { if ((options.editable === 1) && (erp5_form.pt === "form_view")) {
url += "_editable"; url += "_editable";
} }
url += ".html"; url += ".html";
new_state.url = url; new_state.url = url;
new_state.erp5_form = JSON.stringify(erp5_form); new_state.erp5_form = JSON.stringify(erp5_form);
...@@ -151,8 +158,8 @@ ...@@ -151,8 +158,8 @@
sub_options.form_definition = erp5_form; sub_options.form_definition = erp5_form;
sub_options.view = options.view; sub_options.view = options.view;
sub_options.action_view = options.action_view; sub_options.action_view = options.action_view;
sub_options.jio_key = options.jio_key; sub_options.jio_key = options.jio_key; // jIO identifier of currently rendered ERP5 document
sub_options.editable = options.editable; sub_options.editable = options.editable; // form decides on editability of its fields
return page_template_gadget.render(sub_options); return page_template_gadget.render(sub_options);
}) })
......
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>961.11846.36682.48964</string> </value> <value> <string>961.16455.47614.10018</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1501840583.61</float> <float>1502198575.84</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -173,6 +173,7 @@ ...@@ -173,6 +173,7 @@
form_options.form_definition = form_gadget.state.form_definition; form_options.form_definition = form_gadget.state.form_definition;
form_options.view = form_gadget.state.view; form_options.view = form_gadget.state.view;
form_options.jio_key = form_gadget.state.jio_key; form_options.jio_key = form_gadget.state.jio_key;
form_options.editable = form_gadget.state.editable;
return erp5_form.render(form_options); return erp5_form.render(form_options);
}) })
......
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>961.11852.40121.13414</string> </value> <value> <string>961.16461.13159.33399</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1501840477.03</float> <float>1502116641.07</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -60,6 +60,7 @@ ...@@ -60,6 +60,7 @@
form_options.form_definition = form_gadget.state.form_definition; form_options.form_definition = form_gadget.state.form_definition;
form_options.view = form_gadget.state.view; form_options.view = form_gadget.state.view;
form_options.jio_key = form_gadget.state.jio_key; form_options.jio_key = form_gadget.state.jio_key;
form_options.editable = form_gadget.state.editable;
// XXX Hardcoded for listbox's hide functionality // XXX Hardcoded for listbox's hide functionality
form_options.form_definition.hide_enabled = true; form_options.form_definition.hide_enabled = true;
......
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>961.11851.43795.41164</string> </value> <value> <string>961.16133.2066.40123</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1501840485.34</float> <float>1502114387.31</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -70,7 +70,8 @@ ...@@ -70,7 +70,8 @@
form_options.erp5_document = form_gadget.state.erp5_document; form_options.erp5_document = form_gadget.state.erp5_document;
form_options.form_definition = form_gadget.state.form_definition; form_options.form_definition = form_gadget.state.form_definition;
form_options.view = form_gadget.state.view; form_options.view = form_gadget.state.view;
form_options.jio_key = form_gadget.state.jio_key form_options.jio_key = form_gadget.state.jio_key;
form_options.editable = 1;
return erp5_form.render(form_options); return erp5_form.render(form_options);
}) })
......
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>961.11851.10359.5666</string> </value> <value> <string>961.16418.20259.26675</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1501840494.81</float> <float>1502116591.57</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
form_options.form_definition = form_gadget.state.form_definition; form_options.form_definition = form_gadget.state.form_definition;
form_options.view = form_gadget.state.view; form_options.view = form_gadget.state.view;
form_options.name = form_gadget.state.name; form_options.name = form_gadget.state.name;
form_options.editable = form_gadget.state.editable;
return erp5_form.render(form_options); return erp5_form.render(form_options);
}) })
......
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>961.11856.9454.43844</string> </value> <value> <string>961.16458.28534.25173</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1501840453.36</float> <float>1502116475.56</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -3,6 +3,20 @@ ...@@ -3,6 +3,20 @@
(function (window, rJS, RSVP, calculatePageTitle) { (function (window, rJS, RSVP, calculatePageTitle) {
"use strict"; "use strict";
function isGoodNonEditableField(field) {
// ListBox and FormBox should always get a chance to render
if (field.type === "ListBox") {return true; }
if (field.type === "FormBox") {return true; }
// hidden fields should not be obviously rendered
if (field.hidden === 1) {return false; }
// field without default
if (!field.default) {return false; }
if (field.default.length === 0) {return false; }
if (field.default.length === 1 && (!field.default[0])) {return false; }
return true;
}
rJS(window) rJS(window)
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// Acquired methods // Acquired methods
...@@ -48,18 +62,13 @@ ...@@ -48,18 +62,13 @@
.push(function (erp5_form) { .push(function (erp5_form) {
var form_options = gadget.state.erp5_form, var form_options = gadget.state.erp5_form,
rendered_form = gadget.state.erp5_document._embedded._view, rendered_form = gadget.state.erp5_document._embedded._view,
rendered_field,
key; key;
// Remove all empty fields, and mark all others as non editable // Remove all empty or otherwise bad non-editable fields
for (key in rendered_form) { for (key in rendered_form) {
if (rendered_form.hasOwnProperty(key) && (key[0] !== "_")) { if (rendered_form.hasOwnProperty(key) && (key[0] !== "_")) {
rendered_field = rendered_form[key]; if (!isGoodNonEditableField(rendered_form[key])) {
if ((rendered_field.type !== "ListBox") && ((!rendered_field.default) || (rendered_field.hidden === 1) || (rendered_field.default.length === 0)
|| (rendered_field.default.length === 1 && (!rendered_field.default[0])))) {
delete rendered_form[key]; delete rendered_form[key];
} else {
rendered_field.editable = 0;
} }
} }
} }
...@@ -68,6 +77,7 @@ ...@@ -68,6 +77,7 @@
form_options.form_definition = gadget.state.form_definition; form_options.form_definition = gadget.state.form_definition;
form_options.view = gadget.state.view; form_options.view = gadget.state.view;
form_options.jio_key = gadget.state.jio_key; form_options.jio_key = gadget.state.jio_key;
form_options.editable = 0;
return erp5_form.render(form_options); return erp5_form.render(form_options);
}) })
......
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>961.11849.54154.45550</string> </value> <value> <string>961.16419.13605.17578</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1501840503.44</float> <float>1502116554.64</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -32,7 +32,8 @@ ...@@ -32,7 +32,8 @@
} }
}; };
return form_gadget.render({erp5_document: erp5_document, return form_gadget.render({erp5_document: erp5_document,
form_definition: form_definition}); form_definition: form_definition,
editable: 0});
}); });
} }
...@@ -66,7 +67,7 @@ ...@@ -66,7 +67,7 @@
return this.changeState({ return this.changeState({
erp5_document: options.erp5_document, erp5_document: options.erp5_document,
form_definition: options.form_definition, form_definition: options.form_definition,
form_gadget_url: form_gadget_url form_gadget_url: form_gadget_url,
}); });
}) })
.onStateChange(function (modification_dict) { .onStateChange(function (modification_dict) {
...@@ -90,7 +91,8 @@ ...@@ -90,7 +91,8 @@
form_gadget = result; form_gadget = result;
return form_gadget.render({ return form_gadget.render({
erp5_document: gadget.state.erp5_document, erp5_document: gadget.state.erp5_document,
form_definition: gadget.state.form_definition form_definition: gadget.state.form_definition,
editable: 0
}); });
}) })
......
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>954.25919.63902.23893</string> </value> <value> <string>961.16421.12334.2201</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -248,7 +248,7 @@ ...@@ -248,7 +248,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1476194238.38</float> <float>1502116518.17</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