]> git.agnieray.net Git - galette.git/blob - galette/templates/default/components/dynamic_fields.html.twig
72df9f0dd7ac22906a848b2f35a9d9d9d5a2d966
[galette.git] / galette / templates / default / components / dynamic_fields.html.twig
1 {% if object.getDynamicFields() is not empty %}
2 {% set fields = object.getDynamicFields().getFields() %}
3 {% set masschange = masschange ?? false %}
4
5 {% if fields is not empty %}
6
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>
11 {% else %}
12 <label for="info_field_{{ field.getId() }}_{{ loop }}">
13 {% if masschange %}
14 {# Add a checkbox for fields to change on mass edition #}
15 <input type="checkbox" name="mass_info_field_{{ field.getId() }}" class="mass_checkbox"/>
16 {% endif %}
17 {{ field.getName()|escape }}
18 </label>
19 {% endif %}
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 %}
27 {% 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 %}
36 {% endif %}
37 {% if field.isRepeatable() or field.getRepeat() == 0 %}data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
38 {% if disabled %} disabled="disabled"{% endif %}
39 />
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 %}
44 {% endif %}
45 {% if field.isRepeatable() %} data-maxrepeat="{{ field.getRepeat() }}"{% endif %}
46 {% if disabled %} disabled="disabled"{% endif %}
47 >
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>
52 {% endfor %}
53 </select>
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 %}
63 {% endif %}
64 {% if disabled %} disabled="disabled"{% endif %}
65 />
66 </div>
67 </div>
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 %}
76 {% endif %}
77 {% if disabled %} disabled="disabled"{% endif %}
78 />
79 </div>
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}) }}">
83 {{ valuedata }}
84 <i class="external alternate icon"></i>
85 </a>
86 {% endif %}
87 <div class="extra ui basic fitted segment">
88 <div class="ui file action input">
89 <input
90 type="file"
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 %}
95 />
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 %}
99 </label>
100 </div>
101 </div>
102 {% if object.id and valuedata %}
103 <div class="extra ui basic fitted segment">
104 <div class="ui toggle checkbox">
105 <input
106 type="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;"
110 />
111 <label class="labelalign" for="info_field_{{ field.getId() }}_{{ loop }}_delete">
112 {{ _T("delete") }}
113 </label>
114 </div>
115 </div>
116 {% endif %}
117 {% endif %}
118 {% endmacro %}
119
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:") }}
124 </div>
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>
133 </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 -->
136 {% else %}
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 %}
140 {% endif %}
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 %}
145 {% endif #}
146 <div class="
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>
154 {% endif %}
155 </div>
156 {% endfor %}
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 %}
161 {% else %}
162 {% set current_count = 0 %}
163 {% endif %}
164 {{ _self.draw_field(field, field_data, disabled, current_count + 1, object, masschange) }}
165 {% endif %}
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 %}
172 {% else %}
173 {% set current_count = 1 %}
174 {% endif %}
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>
177 {% endif %}
178 {% endif %}
179 </div>
180 {% endif %}
181 {% endfor %}
182 </div>
183 </div>
184 </div>
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>');
189 };
190
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
195
196 _a.click(function(e) {
197 var _new = _input.clone();
198
199 var _id = '';
200
201 for ( var i = 0 ; i < _vals.length -1 ; i++ ) {
202 _id += _vals[i] + '_';
203 }
204
205 _current = Number(_current) + 1;
206 _new.attr('id', _id + _current);
207 _new.attr('name', _id + _current);
208 _new.val('');
209 _a.remove();
210 _parent.append(_new);
211 _parent.append('<br/><br/>');
212 _new.focus();
213 if( _total == '0' || _current < _total ) {
214 var _b = _addLnk();
215 _lnkEvent(_b, _new, _parent);
216 _parent.append(_b);
217 if (_current < _total) {
218 $('#repeat_msg').html('{{ _T("Enter up to %count more occurrences.")|replace({"%count": "COUNT"})|e('js') }}'.replace(/COUNT/, _total - _current));
219 }
220 } else if (_current == _total) {
221 $('#repeat_msg').remove();
222 }
223 return false;
224 });
225 }
226
227 $(function(){
228 $('.repetable').each(function(){
229 var _total;
230 var _current;
231 var _parent = $(this);
232
233 var _input = $(this).find('.field:last input');
234 if ( _input.length > 0 ) {
235 while ( $(this).find('.field').length > 1 && _input.val() == '' ) {
236 _input.remove();
237 _input = $(this).find('.field:last input')
238 }
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
242
243 if ( _total == '0' || _current < _total ) {
244 var _a = _addLnk();
245 $(this).append(_a);
246 _lnkEvent(_a, _input, _parent);
247 }
248 }
249 });
250 });
251 </script>
252 {% endif %}
253 {% endif %}
254 {% endif %}