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