%!
from itertools import izip_longest
from random import randint
%>
<%def name="renderControl(id_name, value, props, default_classes = 'span3')" >
%if props.html_type == "select":
<%
select_value = props.keyToPython(value.get("value") if isinstance(value, dict) else value, request)
custom = value.get("custom") if isinstance(value, dict) else ""
%>
%if getattr(props, 'html_append', None):
%endif
%if getattr(props, 'html_append', None):
${_(props.html_append)|n}
%endif
%if props.hasCustom(request):
%endif
%elif props.html_type == "checkbox":
%elif props.html_type == "textarea":
%else:
<%
html_type = props.html_type
classes = getattr(props, 'classes', default_classes)
if html_type == "number":
html_type = 'text'
classes+= " number"
maxpropname = 'max'
minpropname = 'min'
extras = [("step", "0.01")]
else:
maxpropname = 'maxlength'
minpropname = 'minlength'
extras = []
%>
%if getattr(props, 'html_append', None):
%endif
\
%if getattr(props, 'html_append', None):
${_(props.html_append)|n}
%endif
%endif
%if getattr(props, 'html_help', False):
${_(props.html_help)|n}
%endif
%def>
<%def name="renderFormLine(field_id_name, field, props, values, errors, default_classes = 'span3')">
%if props.html_type == 'hidden':
%else:
%if not getattr(props, "suppress_label", False):
%endif
%if hasattr(props, 'widget'):
<%doc> Try determine caller with the widget definition%doc>
%for callItem in filter(None, caller):
%if hasattr(callItem, props.widget):
${getattr(callItem, props.widget)(field_id_name, values.get(field), props, values, errors, default_classes)|n}
<% break %>
%endif
%endfor
%else:
${self.renderControl(id_name = field_id_name, value=values.get(field), props = props, default_classes = default_classes)}
%endif
%if field in errors:
${errors[field]}
%endif
%endif
%def>
<%def name="buildLayoutElement(props)">
<${props.tag} ${'class="{}"'.format(props.classes) if props.classes else ''|n}">${_(props.html_label)|n}${props.tag}>
%def>
<%def name="buildListItemSubform(key, position, schema, values, errors, id_key = None, default_classes = 'span3', props = None)">
<${schema.html_tag} class="form-embedded ${schema.html_classes}" ${'id="template-{}"'.format(key.replace(".","-")) if position == 0 else ""|n}>
%if position > 0:
×
%endif
${position+1}
%if id_key:
%endif
%for i, field in enumerate(schema.form_order):
<%
props = schema.fields[field]
field_id_name = "{}-{}.{}".format(key, position, field)
%>
${self.renderFormLine(field_id_name, field, props, values, getattr(errors, "error_dict", dict()), default_classes = getattr(schema, "default_classes", default_classes))}
%endfor
${schema.html_tag}>
%def>
<%def name="buildListSubforms(field_id_name, field, props, values, errors, id_key = None)">
%def>
<%def name="buildSubform(key, schema, values, errors, default_classes = 'span3')">
<${schema.html_tag} class="${schema.html_classes}">
%for i, field in enumerate(schema.form_order):
%if schema.fields.get(field):
<%
props = schema.fields[field]
field_id_name = "{}.{}".format(key, field)
%>
${self.renderFormLine(field_id_name, field, props, values, getattr(errors, "error_dict", dict()), default_classes = default_classes)}
%else:
${self.buildLayoutElement(getattr(schema, field))}
%endif
%endfor
${schema.html_tag}>
%def>
<%def name="prelims(schema)">
%def>
<%def name="buildFormContent(schema, values, errors)">
${self.prelims(schema)}
%def>
<%def name="buildform(schema, values, errors)">
<%
values = values[schema.form_id]
errors = errors[schema.form_id]
%>
%def>
<%def name="buildValidators(root, success=True, expanding_list = False, with_custom_select = False)">
%if "de" in request._LOCALE_.lower():
$.validator.methods.range = function (value, element, param) {
var globalizedValue = value.replace(",", ".");
return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);
}
$.validator.methods.number = function (value, element) {
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
}
%endif
${root}.find("form.form-validated").each(function(index, form){
var validator = $(form).validate({
errorClass: "help-inline"
,errorElement: "span"
,highlight: function (element, errorClass, validClass) {
$(element).closest(".control-group").addClass("error").removeClass(validClass);
}
, unhighlight: function (element, errorClass, validClass) {
$(element).closest(".control-group").removeClass("error").addClass(validClass);
}
});
$(form).find("input[type=reset], button[type=reset]").click(function(e) {
validator.resetForm();
$(form).find(".error").removeClass("error");
});
});
%if with_custom_select:
var checkSelectedOption = function(selectInput){
var selected = selectInput.find("option:selected")
if(selected.attr("data-entity-custom")){
selectInput.parent().find(".select-option-custom").show();
} else {
selectInput.parent().find(".select-option-custom").hide();
selectInput.closest(".control-group").removeClass("error").find("[generated]").remove();
}
};
${root}.find("form.form-validated").on({change:function(e){checkSelectedOption($(e.target));}}, "select");
${root}.find("form.form-validated").find("select").each(function(idx, selectInput){checkSelectedOption($(selectInput))});
%endif
%if expanding_list:
${root}.on({click:function(e){
var $target = $(e.target)
, $embeddedForm = $target.closest(".form-embedded")
, refLink = $target.closest(".form-embedded-wrapper").find(".add-more-listitem")
, delLink = $target.remove();
refLink.attr("_field_position", parseInt(refLink.attr("_field_position"), 10) - 1);
if($embeddedForm.prevAll(".form-embedded").length>1){
$embeddedForm.prev().prepend(delLink);
}
$embeddedForm.remove();
}
}, ".add-more-delete-link");
${root}.on({
click : function(e){
var $target = $(e.target)
, $form = $target.closest("form")
, templ = $("#template-"+$target.attr("_field_key"))
, new_node = templ.clone().removeAttr("id")
, new_position = parseInt($target.attr("_field_position"), 10) + 1
, inc = function(elem, attr){
elem.attr(attr, elem.attr(attr).replace(/-[0-9]+\./g, "-"+new_position+"."))
};
new_node.find("input[type=hidden]").remove();
new_node.find("label").each(function(index, elem){
elem = $(elem); inc(elem, "for");
});
new_node.find("input,select,textarea").each(function(index, elem){
elem = $(elem);
inc(elem, "id");
inc(elem, "name");
elem.val("");
});
new_node.find(".control-number").html(new_position+1);
$target.attr("_field_position", new_position);
$target.closest(".add-more").before(new_node);
var delete_link = $form.find(".add-more-delete-link").remove();
if(delete_link.length === 0){
delete_link = $('×')
}
new_node.prepend(delete_link);
new_node.find("[generated]").remove();
new_node.find(".error").removeClass("error");
new_node.find(".valid").removeClass("valid");
}
}, ".add-more-listitem");
%endif
%def>
<% modal_id = "confirmSubmit-{}".format(randint(0, 100000)) %>