1 {% if object.getDynamicFields() is not empty %}
2 {% set fields = object.getDynamicFields().getFields() %}
3 {% set masschange = masschange ?? false %}
5 {% if fields is not empty %}
7 {% macro draw_field(field, field_data, disabled, loop, object, masschange) %}
8 {% set valuedata = field_data.field_val|escape %}
9 {% if get_class(field) == 'Galette\\DynamicFields\\File' %}
10 <label>{{ field.getName()|escape }}</label>
12 <label for="info_field_{{ field.getId() }}_{{ loop }}">
14 {# Add a checkbox for fields to change on mass edition #}
15 <input type="checkbox" name="mass_info_field_{{ field.getId() }}" class="mass_checkbox"/>
17 {{ field.getName()|escape }}
20 {% if get_class(field) == 'Galette\\DynamicFields\\Text' %}
21 <textarea name="info_field_{{ field.getId() }}_{{ loop }}" id="info_field_{{ field.getId() }}_{{ loop }}"
22 cols="{% if field.getWidth() > 0 %}{{ field.getWidth() }}{else}61{% endif %}"
23 rows="{% if field.getHeight() > 0 %}{{ field.getHeight() }}{else}6{% endif %}"
24 {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
25 {% if not masschange %}
26 {% if field.isRequired() %} required="required"{% endif %}
28 {% if disabled %} disabled="disabled"{% endif %}>{{ valuedata|raw }}</textarea>
29 {% elseif get_class(field) == 'Galette\\DynamicFields\\Line' %}
30 <input type="text" name="info_field_{{ field.getId() }}_{{ loop }}" id="info_field_{{ field.getId() }}_{{ loop }}"
31 {% if field.getWidth() > 0 %}size="{{ field.getWidth() }}"{% endif %}
32 {% if field.getSize() > 0 %}maxlength="{{ field.getSize() }}"{% endif %}
33 value="{{ valuedata|raw }}"
34 {% if not masschange %}
35 {% if field.isRequired() %} required="required"{% endif %}
37 {% if field.isRepeatable() or field.getRepeat() == 0 %}data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
38 {% if disabled %} disabled="disabled"{% endif %}
40 {% elseif get_class(field) == 'Galette\\DynamicFields\\Choice' %}
41 <select name="info_field_{{ field.getId() }}_{{ loop }}" id="info_field_{{ field.getId() }}_{{ loop }}"
42 {% if not masschange %}
43 {% if field.isRequired() %} required="required"{% endif %}
45 {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
46 {% if disabled %} disabled="disabled"{% endif %}
48 <!-- If no option is present, page is not XHTML compliant -->
49 <option value="">{{ _T("Select an option") }}</option>
50 {% for key, value in field.getValues() %}
51 <option value="{{ key }}"{% if key == valuedata %} selected="selected"{% endif %}>{{ value }}</option>
54 {% elseif get_class(field) == 'Galette\\DynamicFields\\Date' %}
55 <div id="dynamic_date_{{ field.getId() }}_rangestart" class="ui calendar">
56 <div class="ui fluid input left icon">
57 <i class="calendar icon"></i>
58 <input type="text" name="info_field_{{ field.getId() }}_{{ loop }}" id="info_field_{{ field.getId() }}_{{ loop }}" maxlength="10"
59 value="{{ valuedata }}" class="dynamic_date modif_date"
60 {% if field.isRepeatable() %} data-maxrepeat="{field.getRepeat()}"{% endif %}
61 {% if not masschange %}
62 {% if field.isRequired() %} required="required"{% endif %}
64 {% if disabled %} disabled="disabled"{% endif %}
68 <span class="exemple">{{ _T("(yyyy-mm-dd format)") }}</span>
69 {% elseif get_class(field) == 'Galette\\DynamicFields\\Boolean' %}
70 <div class="ui toggle checkbox">
71 <input type="checkbox" name="info_field_{{ field.getId() }}_{{ loop }}" id="info_field_{{ field.getId() }}_{{ loop }}" value="1"
72 {% if valuedata == 1%} checked="checked"{% endif %}
73 {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
74 {% if not masschange %}
75 {% if field.isRequired() %} required="required"{% endif %}
77 {% if disabled %} disabled="disabled"{% endif %}
80 {% elseif get_class(field) == 'Galette\\DynamicFields\\File' %}
81 {% if object.id and valuedata %}
82 <a href="{{ url_for("getDynamicFile", {"form_name": object.getFormName(), "id": object.id, "fid": field.getId(), "pos": loop, "name": valuedata}) }}">
84 <i class="external alternate icon"></i>
87 <div class="extra ui basic fitted segment">
88 <div class="ui file action input">
91 name="info_field_{{ field.getId() }}_{{ loop }}"
92 id="info_field_{{ field.getId() }}_{{ loop }}_new"
93 {% if field.isRequired() and valuedata == '' %} required="required"{% endif %}
94 {% if disabled %} disabled="disabled"{% endif %}
96 <label for="info_field_{{ field.getId() }}_{{ loop }}_new" class="ui button">
97 <i class="blue upload icon"></i>
98 {% if object.id and valuedata %}{{ _T("Choose another file") }}{% else %}{{ _T("Choose a file") }}{% endif %}
102 {% if object.id and valuedata %}
103 <div class="extra ui basic fitted segment">
104 <div class="ui toggle checkbox">
107 name="info_field_{{ field.getId() }}_{{ loop }}"
108 id="info_field_{{ field.getId() }}_{{ loop }}_delete"
109 onclick="this.form.info_field_{{ field.getId() }}_{{ loop }}_new.disabled = this.checked;"
111 <label class="labelalign" for="info_field_{{ field.getId() }}_{{ loop }}_delete">
120 <div class="ui styled fluid accordion field">
121 <div class="active title">
122 <i class="jsonly displaynone icon dropdown"></i>
123 {{ _T("Additionnal fields:") }}
125 <div class="active content field">
126 <div class="ui three column stackable grid">
127 {% set access_level = login.getAccessLevel() %}
128 {% for field in fields %}
129 {% set perm = field.getPerm() %}
130 {% if get_class(field) == 'Galette\\DynamicFields\\Separator' %}
131 <div class="sixteen wide column">
132 <div class="ui horizontal divider">{{ field.getName()|escape }}</div>
134 {% elseif (get_class(field) == 'Galette\\DynamicFields\\File' or field.isRepeatable()) and masschange %}
135 <!-- File and repeatable fields not shown in mass changes form -->
137 {% set disabled = false %}
138 {% if perm == constant('Galette\\DynamicFields\\DynamicField::PERM_USER_READ') and access_level == constant('Galette\\Core\\Authentication::ACCESS_USER') %}
139 {% set disabled = true %}
141 {% set values = object.getDynamicFields().getValues(field.getId()) %}
142 {# set can_add = false %}
143 {% if field.getRepeat() == 0 or values is not iterable or values|length < field.getRepeat() or values|length == 0 %}
144 {% set can_add = true %}
147 {% if get_class(field) == 'Galette\\DynamicFields\\File' or (field.isRepeatable() and field.getRepeat() > 1) or (field.isMultiValued() and field.getRepeat() == 0) %}
148 repetable sixteen wide {% endif %}column">
149 {% for field_data in values %}
150 <div class="field{% if field.isRequired() %} required{% endif %}">
151 {{ _self.draw_field(field, field_data, disabled, loop.index, object, masschange) }}
152 {% if field.getInformation() %}
153 <p class="exemple">{{ field.getInformation()|raw }}</p>
157 {% if values is not iterable or values|length == 0 %}
158 {% set field_data = {'field_val': ''} %}
159 {% if values is iterable %}
160 {% set current_count = values|length %}
162 {% set current_count = 0 %}
164 {{ _self.draw_field(field, field_data, disabled, current_count + 1, object, masschange) }}
166 {% if field.isRepeatable() %}
167 {% if field.getRepeat() == 0 %}
168 <p class="exemple" id="repeat_msg">{{ _T("Enter as many occurences you want.") }}</p>
169 {% elseif values is not iterable or values|length < field.getRepeat() or values|length == 0 %}
170 {% if values is iterable %}
171 {% set current_count = values|length %}
173 {% set current_count = 1 %}
175 {% set remaining = field.getRepeat() - current_count %}
176 <p class="exemple" id="repeat_msg">{{ _T("Enter up to %count more occurences.")|replace({"%count": remaining}) }}</p>
185 {% if not masschange %}
186 <script type="text/javascript">
187 var _addLnk = function(){
188 return $('<a class="ui tiny green labeled icon button" href="#"><i class="plus icon"></i> {{ _T("Add") }}</a>');
191 var _lnkEvent = function(_a, _input, _parent) {
192 var _vals = _input[0].id.split(/_/);
193 var _total = $(_input[0]).data('maxrepeat'); //max number of occurrences
194 var _current = _vals[_vals.length-1]; //current occurrence
196 _a.click(function(e) {
197 var _new = _input.clone();
201 for ( var i = 0 ; i < _vals.length -1 ; i++ ) {
202 _id += _vals[i] + '_';
205 _current = Number(_current) + 1;
206 _new.attr('id', _id + _current);
207 _new.attr('name', _id + _current);
210 _parent.append(_new);
211 _parent.append('<br/><br/>');
213 if( _total == '0' || _current < _total ) {
215 _lnkEvent(_b, _new, _parent);
217 if (_current < _total) {
218 $('#repeat_msg').html('{{ _T("Enter up to %count more occurrences.")|replace({"%count": "COUNT"})|e('js') }}'.replace(/COUNT/, _total - _current));
220 } else if (_current == _total) {
221 $('#repeat_msg').remove();
228 $('.repetable').each(function(){
231 var _parent = $(this);
233 var _input = $(this).find('.field:last input');
234 if ( _input.length > 0 ) {
235 while ( $(this).find('.field').length > 1 && _input.val() == '' ) {
237 _input = $(this).find('.field:last input')
239 var _vals = _input[0].id.split(/_/);
240 var _total = $(_input[0]).data('maxrepeat'); //max number of occurrences
241 var _current = _vals[_vals.length-1]; //current occurrence
243 if ( _total == '0' || _current < _total ) {
246 _lnkEvent(_a, _input, _parent);