Ajout du support des écritures ventilées.
[garradin.git] / templates / admin / config / membres.tpl
1 {include file="admin/_head.tpl" title="Configuration — Fiche membres" current="config"}
2
3 {include file="admin/config/_menu.tpl" current="membres"}
4
5 {if $error}
6 {if $error == 'OK'}
7 <p class="confirm">
8 La configuration a bien été enregistrée.
9 </p>
10 {elseif $error == 'ADD_OK'}
11 <p class="confirm">
12 Le champ a été ajouté à la fin de la liste.
13 </p>
14 {else}
15 <p class="error">
16 {$error|escape}
17 </p>
18 {/if}
19 {/if}
20
21 {if $debug}
22 <p class="debug">
23 TOTO
24 {$debug|escape}
25 </p>
26 {/if}
27
28
29 {if $review}
30 <fieldset>
31 <legend>Fiche membre exemple</legend>
32 <dl>
33 {foreach from=$champs item="champ" key="nom"}
34 {if $nom == 'passe'}{continue}{/if}
35 {html_champ_membre config=$champ name=$nom disabled=true}
36 {if empty($champ.editable) || !empty($champ.private)}
37 <dd>
38 {if !empty($champ.private)}
39 (Champ privé)
40 {elseif empty($champ.editable)}
41 (Non-modifiable par les membres)
42 {/if}
43 </dd>
44 {/if}
45 {/foreach}
46 </dl>
47 </fieldset>
48
49 <fieldset id="f_passe">
50 <legend>Connexion</legend>
51 <dl>
52 <dt><label for="f_passe">Mot de passe</label>{if !empty($champs.passe.mandatory)} <b title="(Champ obligatoire)">obligatoire</b>{/if}</dt>
53 <dd><input type="password" id="f_passe" disabled="disabled" /></dd>
54 {if empty($champs.passe.editable) || !empty($champs.passe.private)}
55 <dd>
56 {if !empty($champs.passe.private)}
57 (Champ privé)
58 {elseif empty($champs.passe.editable)}
59 (Non-modifiable par les membres)
60 {/if}
61 </dd>
62 {/if}
63 </dl>
64 </fieldset>
65
66 <form method="post" action="{$admin_url}config/membres.php">
67 <p class="submit">
68 {csrf_field key="config_membres"}
69 <input type="submit" name="back" value="&larr; Retour à l'édition" class="minor" />
70 <input type="submit" name="reset" value="Annuler les changements" class="minor" />
71 <input type="submit" name="save" value="Enregistrer &rarr;" />
72 </p>
73 </form>
74 {else}
75 <p class="help">
76 Cette page vous permet de personnaliser les fiches d'information des membres de l'association.<br />
77 <strong>Attention :</strong> Les champs supprimés de la fiche seront effacés de toutes les fiches de tous les membres, et les données qu'ils contenaient seront perdues.
78 </p>
79
80 <fieldset>
81 <legend>Champs non-personnalisables</legend>
82 <dl>
83 <dt>Numéro unique</dt>
84 <dd>Ce numéro identifie de manière unique chacun des membres.
85 Il est incrémenté à chaque nouveau membre ajouté.</dd>
86 <dt>Catégorie</dt>
87 <dd>Identifie la catégorie du membre.</dd>
88 <dt>Date de dernière connexion</dt>
89 <dd>Mémorise la date de dernière connexion à l'administration de Garradin.</dd>
90 <dt>Date d'inscription</dt>
91 <dd>Enregistre la date de création de la fiche du membre.</dd>
92 </dl>
93 </fieldset>
94
95 {if !empty($presets)}
96 <form method="post" action="{$self_url|escape}">
97 <fieldset>
98 <legend>Ajouter un champ pré-défini</legend>
99 <p>
100 <select name="preset" required="required">
101 <option></option>
102 {foreach from=$presets key="name" item="preset"}
103 <option value="{$name|escape}">{$name|escape} &mdash; {$preset.title|escape}</option>
104 {/foreach}
105 </select>
106 <input type="hidden" name="{$csrf_name|escape}" value="{$csrf_value|escape}" />
107 <input type="submit" name="add" value="Ajouter ce champ à la fiche membre" />
108 </p>
109 </fieldset>
110 </form>
111 {/if}
112
113 <form method="post" action="{$self_url|escape}">
114 <fieldset>
115 <legend>Ajouter un champ personnalisé</legend>
116 <dl>
117 <dt><label for="f_name">Nom unique</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
118 <dd class="help">Ne peut comporter que des lettres minuscules et des tirets bas.</dd>
119 <dd><input type="text" name="new" id="f_name" value="{form_field name=new}" size="30" required="required" /></dd>
120 <dt><label for="f_title">Titre</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
121 <dd><input type="text" name="new_title" id="f_title" value="{form_field name=new_title}" size="60" required="required" /></dd>
122 <dt><label for="f_type">Type de champ</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
123 <dd>
124 <select name="new_type" id="f_type" required="required">
125 {foreach from=$types key="type" item="nom"}
126 <option value="{$type|escape}" {form_field name=new_type selected=$type}>{$nom|escape}</option>
127 {/foreach}
128 </select>
129 </dd>
130 </dl>
131 <p>
132 <input type="hidden" name="{$csrf_name|escape}" value="{$csrf_value|escape}" />
133 <input type="submit" name="add" value="Ajouter ce champ à la fiche membre" />
134 </p>
135 </fieldset>
136 </form>
137
138 <form method="post" action="{$self_url|escape}">
139 <div id="orderFields">
140 {foreach from=$champs item="champ" key="nom"}
141 {if $nom == 'passe'}{continue}{/if}
142 <fieldset id="f_{$nom|escape}">
143 <legend>{$nom|escape}</legend>
144 <dl>
145 <dt><label>Type</label></dt>
146 <dd>{$champ.type|get_type}</dd>
147 <dt><label for="f_{$nom|escape}_title">Titre</label> <b title="(Champ obligatoire)">obligatoire</b></dt>
148 <dd><input type="text" name="champs[{$nom|escape}][title]" id="f_{$nom|escape}_title" value="{form_field data=$champs[$nom] name=title}" size="60" required="required" /></dd>
149 <dt><label for="f_{$nom|escape}_help">Aide</label></dt>
150 <dd><input type="text" name="champs[{$nom|escape}][help]" id="f_{$nom|escape}_help" value="{form_field data=$champs[$nom] name=help}" size="100" /></dd>
151 <dt><label><input type="checkbox" name="champs[{$nom|escape}][editable]" value="1" {form_field data=$champs[$nom] name=editable checked="1"} /> Modifiable par les membres</label></dt>
152 <dd class="help">Si coché, les membres pourront changer cette information depuis leur espace personnel.</dd>
153 <dt><label><input type="checkbox" name="champs[{$nom|escape}][mandatory]" value="1" {form_field data=$champs[$nom] name=mandatory checked="1"} /> Champ obligatoire</label></dt>
154 <dd class="help">Si coché, ce champ ne pourra rester vide.</dd>
155 <dt><label><input type="checkbox" name="champs[{$nom|escape}][private]" value="1" {form_field data=$champs[$nom] name=private checked="1"} /> Champ privé</label></dt>
156 <dd class="help">Si coché, ce champ ne sera visible et modifiable que par les personnes pouvant gérer les membres, mais pas les membres eux-même.</dd>
157 {if $champ.type == 'select' || $champ.type == 'multiple'}
158 <dt><label>Options disponibles</label></dt>
159 {if $champ.type == 'multiple'}
160 <dd class="help">Attention changer l'ordre des options peut avoir des effets indésirables.</dd>
161 {else}
162 <dd class="help">Attention renommer ou supprimer une option n'affecte pas ce qui a déjà été enregistré dans les fiches des membres.</dd>
163 {/if}
164 <dd>
165 <{if $champ.type == 'multiple'}ol{else}ul{/if} class="options">
166 {if !empty($champ.options)}
167 {foreach from=$champ.options key="key" item="opt"}
168 <li><input type="text" name="champs[{$nom|escape}][options][]" value="{$opt|escape}" size="50" /></li>
169 {/foreach}
170 {/if}
171 {if $champ.type == 'select' || empty($champ.options) || count($champ.options) < 32}
172 <li><input type="text" name="champs[{$nom|escape}][options][]" value="" size="50" /></li>
173 {/if}
174 </dd>
175 {/if}
176 <dt><label for="f_list_row">Numéro de colonne dans la liste des membres</label></dt>
177 <dd class="help">Laisser vide ou indiquer le chiffre zéro pour que ce champ n'apparaisse pas dans la liste des membres. Inscrire un chiffre entre 1 et 10 pour indiquer l'ordre d'affichage du champ dans le tableau de la liste des membres.</dd>
178 <dd><input type="number" id="f_list_row" name="champs[{$nom|escape}][list_row]" min="0" max="10" value="{form_field data=$champs[$nom] name=list_row}" /></dd>
179 </dl>
180 </fieldset>
181 {/foreach}
182 </div>
183
184 <fieldset id="f_passe">
185 <legend>Mot de passe</legend>
186 <dl>
187 <dt><label><input type="checkbox" name="champs[passe][editable]" value="1" {form_field data=$champs.passe name=editable checked="1"} /> Modifiable par les membres</label></dt>
188 <dd class="help">Si coché, les membres pourront changer cette information depuis leur espace personnel.</dd>
189 <dt><label><input type="checkbox" name="champs[passe][mandatory]" value="1" {form_field data=$champs.passe name=mandatory checked="1"} /> Champ obligatoire</label></dt>
190 <dd class="help">Si coché, ce champ ne pourra rester vide.</dd>
191 <dt><label><input type="checkbox" name="champs[passe][private]" value="1" {form_field data=$champs.passe name=private checked="1"} /> Champ privé</label></dt>
192 <dd class="help">Si coché, ce champ ne sera visible et modifiable que par les personnes pouvant gérer les membres, mais pas les membres eux-même.</dd>
193 </dl>
194 </fieldset>
195
196 <p class="submit">
197 <input type="hidden" name="{$csrf_name|escape}" value="{$csrf_value|escape}" />
198 <input type="submit" name="reset" value="Annuler les changements" class="minor" />
199 <input type="submit" name="review" value="Enregistrer &rarr;" />
200 (un récapitulatif sera présenté et une confirmation sera demandée)
201 </p>
202 </form>
203
204 <script type="text/javascript">
205 {literal}
206 (function () {
207 if (!document.querySelector || !document.querySelectorAll)
208 {
209 return false;
210 }
211
212 var fields = document.querySelectorAll('#orderFields fieldset');
213
214 for (i = 0; i < fields.length; i++)
215 {
216 var field = fields[i];
217 field.querySelector('dl').style.display = 'none';
218
219 var legend = field.querySelector('legend');
220
221 legend.onclick = function () {
222 var content = this.parentNode.querySelector('dl');
223 if (content.style.display.toLowerCase() == 'none')
224 content.style.display = 'block';
225 else
226 content.style.display = 'none';
227 }
228
229 legend.className = 'interactive';
230 legend.title = 'Cliquer pour modifier ce champ';
231
232 var actions = document.createElement('div');
233 actions.className = 'actions';
234 field.appendChild(actions);
235
236 var up = document.createElement('a');
237 up.className = 'icn up';
238 up.innerHTML = '&uarr;';
239 up.title = 'Déplacer vers le haut';
240 up.onclick = function (e) {
241 var field = this.parentNode.parentNode;
242 var p = field.previousSibling;
243 while (p.nodeType == 3) { p = p.previousSibling; }
244 field.parentNode.insertBefore(field, p);
245 return false;
246 };
247 actions.appendChild(up);
248
249 var down = document.createElement('a');
250 down.className = 'icn down';
251 down.innerHTML = '&darr;';
252 down.title = 'Déplacer vers le bas';
253 down.onclick = function (e) {
254 var field = this.parentNode.parentNode;
255 var p = field.nextSibling;
256
257 if (!p.nextSibling)
258 {
259 field.parentNode.appendChild(field);
260 }
261 else
262 {
263 while (p.nodeType == 3) { p = p.nextSibling; }
264 p = p.nextSibling;
265 while (p.nodeType == 3) { p = p.nextSibling; }
266 field.parentNode.insertBefore(field, p);
267 }
268 return false;
269 };
270 actions.appendChild(down);
271
272 var edit = document.createElement('a');
273 edit.className = 'icn edit';
274 edit.innerHTML = '&#x270e;';
275 edit.title = 'Modifier ce champ';
276 edit.onclick = function (e) {
277 var content = this.parentNode.parentNode.querySelector('dl');
278 if (content.style.display.toLowerCase() == 'none')
279 content.style.display = 'block';
280 else
281 content.style.display = 'none';
282 return false;
283 };
284 actions.appendChild(edit);
285
286 if (field.id != 'f_email' && field.id != 'f_passe')
287 {
288 var rem = document.createElement('a');
289 rem.className = 'icn remove';
290 rem.innerHTML = '✘';
291 rem.title = 'Enlever ce champ de la fiche';
292 rem.onclick = function (e) {
293 if (!window.confirm('Êtes-vous sûr de supprimer ce champ des fiches de membre ?'))
294 {
295 return false;
296 }
297
298 var field = this.parentNode.parentNode;
299 field.parentNode.removeChild(field);
300 return false;
301 };
302 actions.appendChild(rem);
303 }
304
305 if (field.querySelector('.options'))
306 {
307 var options = field.querySelectorAll('.options li');
308 var options_nb = options.length;
309
310 if (options[0].parentNode.tagName.toLowerCase() == 'ul')
311 {
312 // champ select
313 for (j = 0; j < options_nb; j++)
314 {
315 var remove = document.createElement('input');
316 remove.type = 'button';
317 remove.className = 'icn';
318 remove.value = '-';
319 remove.title = 'Enlever cette option';
320 remove.onclick = function (e) {
321 var p = this.parentNode;
322 p.parentNode.removeChild(p);
323 };
324 options[j].appendChild(remove);
325 }
326 }
327
328 var add = document.createElement('input');
329 add.type = 'button';
330 add.className = 'icn add';
331 add.value = '+';
332 add.title = 'Ajouter une option';
333 add.onclick = function (e) {
334 var p = this.parentNode.parentNode;
335 var options = p.querySelectorAll('li');
336 var new_option = this.parentNode.cloneNode(true);
337 var btn = new_option.querySelector('input.add');
338 new_option.getElementsByTagName('input')[0].value = '';
339
340 if (options.length >= 30)
341 {
342 new_option.removeChild(btn);
343 }
344 else
345 {
346 btn.onclick = this.onclick;
347 }
348
349 p.appendChild(new_option);
350 this.parentNode.removeChild(this);
351 };
352
353 options[options_nb - 1].appendChild(add);
354 }
355 }
356 }());
357 {/literal}
358 </script>
359 {/if}
360
361 {include file="admin/_foot.tpl"}