source: trunk/admin/themes/default/template/user_list.tpl @ 25475

Last change on this file since 25475 was 25475, checked in by plg, 10 years ago

feature 1668: new display of userDetails, manage group list in user details,
display registration date in user list.

work in progress, not finished yet.

  • Property svn:eol-style set to LF
File size: 28.3 KB
Line 
1{combine_script id='common' load='footer' path='admin/themes/default/js/common.js'}
2
3{combine_script id='jquery.dataTables' load='footer' path='themes/default/js/plugins/jquery.dataTables.js'}
4{combine_css path="themes/default/js/plugins/datatables/css/jquery.dataTables.css"}
5
6{combine_script id='jquery.chosen' load='footer' path='themes/default/js/plugins/chosen.jquery.min.js'}
7{combine_css path="themes/default/js/plugins/chosen.css"}
8
9{footer_script}
10var selectedMessage_pattern = "{'%d of %d photos selected'|@translate}";
11var selectedMessage_none = "{'No photo selected, %d photos in current set'|@translate}";
12var selectedMessage_all = "{'All %d photos are selected'|@translate}";
13var applyOnDetails_pattern = "{'on the %d selected users'|@translate}";
14var newUser_pattern = "✔ {'User %s added'|translate}";
15var registeredOn_pattern = "{'Registered on %s, %s.'|translate}";
16var lastVisit_pattern = "{'Last visit on %s, %s.'|translate}";
17var missingConfirm = "{'You need to confirm deletion'|translate}";
18var missingUsername = "{'Please, enter a login'|translate}";
19
20var allUsers = [{$all_users}];
21var selection = [{$selection}];
22var pwg_token = "{$PWG_TOKEN}";
23
24var truefalse = {
25  true:"{'Yes'|translate}",
26  false:"{'No'|translate}",
27};
28{/footer_script}
29
30{footer_script}{literal}
31jQuery(document).ready(function() {
32  /**
33   * Add user
34   */
35  jQuery("#addUser").click(function() {
36    jQuery("#addUserForm").toggle();
37    jQuery("#showAddUser .infos").hide();
38    jQuery("input[name=username]").focus();
39    return false;
40  });
41
42  jQuery("#addUserClose").click(function() {
43    jQuery("#addUserForm").hide();
44    return false;
45  });
46
47  jQuery("#addUserForm").submit(function() {
48    jQuery.ajax({
49      url: "ws.php?format=json&method=pwg.users.add",
50      type:"POST",
51      data: jQuery(this).serialize(),
52      beforeSend: function() {
53        jQuery("#addUserForm .errors").hide();
54
55        if (jQuery("input[name=username]").val() == "") {
56          jQuery("#addUserForm .errors").html('✘ '+missingUsername).show();
57          return false;
58        }
59
60        jQuery("#addUserForm .loading").show();
61      },
62      success:function(data) {
63        oTable.fnDraw();
64        jQuery("#addUserForm .loading").hide();
65
66        var data = jQuery.parseJSON(data);
67        if (data.stat == 'ok') {
68          jQuery("#addUserForm input[type=text], #addUserForm input[type=password]").val("");
69
70          var new_user = data.result.users[0];
71          allUsers.push(parseInt(new_user.id));
72          jQuery("#showAddUser .infos").html(sprintf(newUser_pattern, new_user.username)).show();
73          checkSelection();
74
75          jQuery("#addUserForm").hide();
76        }
77        else {
78          jQuery("#addUserForm .errors").html('✘ '+data.message).show();
79        }
80      },
81      error:function(XMLHttpRequest, textStatus, errorThrows) {
82        jQuery("#addUserForm .loading").hide();
83      }
84    });
85
86    return false;
87  });
88
89  /**
90   * Table with users
91   */
92  /* Formating function for row details */
93  function fnFormatDetails(oTable, nTr) {
94    var userId = oTable.fnGetData(nTr)[0];
95    console.log("userId = "+userId);
96    var sOut = null;
97
98    jQuery.ajax({
99      url: "ws.php?format=json&method=pwg.users.getList",
100      type:"POST",
101      data: {
102        user_id: userId,
103        display: "all",
104      },
105      success:function(data) {
106        jQuery("#user"+userId+" .loading").hide();
107
108        var data = jQuery.parseJSON(data);
109        if (data.stat == 'ok') {
110          var user = data.result.users[0];
111
112          var userDetails = '<form>';
113          userDetails += '<div class="userActions">';
114          userDetails += '<a class="icon-key" href="#">Change password</a>';
115          userDetails += '<br><a href="#" class="icon-lock">Permissions</a>';
116          userDetails += '<br><a href="#" class="icon-trash">Delete</a>';
117          userDetails += '</div>';
118          userDetails += '<strong>'+user.username+'</strong> <span class="icon-pencil"></span>';
119          userDetails += '<br><br>';
120          userDetails += sprintf(registeredOn_pattern, user.registration_date_string, user.registration_date_since);
121
122          if (typeof user.last_visit != 'undefined') {
123            userDetails += '<br>'+sprintf(lastVisit_pattern, user.last_visit_string, user.last_visit_since);
124          }
125
126          userDetails += '<div class="userPropertiesContainer">';
127          userDetails += '<input type="hidden" name="user_id" value="'+user.id+'">';
128          userDetails += '<div class="userPropertiesSet">';
129          userDetails += '<div class="userPropertiesSetTitle">{/literal}{'Properties'|translate}{literal}</div>';
130
131          userDetails += '<div class="userProperty"><strong>{/literal}{'Email address'|translate}{literal}</strong>';
132          userDetails += '<br><input name="email" type="text" value="'+user.email+'"></div>';
133
134          userDetails += '<div class="userProperty"><strong>{/literal}{'Status'|translate}{literal}</strong>';
135          userDetails += '<br><select name="status">';
136          jQuery("#action select[name=status] option").each(function() {
137            var selected = '';
138            if (user.status == jQuery(this).val()) {
139              selected = ' selected="selected"';
140            }
141            userDetails += '<option value="'+jQuery(this).val()+'"'+selected+'>'+jQuery(this).html()+'</option>';
142          });
143          userDetails += '</select></div>';
144
145          userDetails += '<div class="userProperty"><strong>{/literal}{'Privacy level'|translate}{literal}</strong>';
146          userDetails += '<br><select name="level">';
147          jQuery("#action select[name=level] option").each(function() {
148            var selected = '';
149            if (user.level == jQuery(this).val()) {
150              selected = ' selected="selected"';
151            }
152            userDetails += '<option value="'+jQuery(this).val()+'"'+selected+'>'+jQuery(this).html()+'</option>';
153          });
154          userDetails += '</select></div>';
155
156          var checked = '';
157          if (user.enabled_high == 'true') {
158            checked = ' checked="checked"';
159          }
160          userDetails += '<div class="userProperty"><label><input type="checkbox" name="enabled_high"'+checked+'> <strong>{/literal}{'High definition enabled'|translate}{literal}</strong></label>';
161          userDetails += '</div>';
162
163          userDetails += '<div class="userProperty"><strong>{/literal}{'Groups'|translate}{literal}</strong>';
164          userDetails += '<br><select multiple class="chzn-select" style="width:340px;" name="group_id[]">';
165          jQuery("#action select[name=associate] option").each(function() {
166            var selected = '';
167            if (user.groups.indexOf(jQuery(this).val()) != -1) {
168              selected = ' selected="selected"';
169            }
170            userDetails += '<option value="'+jQuery(this).val()+'"'+selected+'>'+jQuery(this).html()+'</option>';
171          });
172          userDetails += '</select></div>';
173          // userDetails += '<br>'+user.groups.join(",")+'</div>';
174
175          userDetails += '</div><div class="userPropertiesSet userPrefs">';
176          userDetails += '<div class="userPropertiesSetTitle">{/literal}{'Preferences'|translate}{literal}</div>';
177
178          userDetails += '<div class="userProperty"><strong>{/literal}{'Number of photos per page'|translate}{literal}</strong>';
179          userDetails += '<br>'+user.nb_image_page+'</div>';
180
181          userDetails += '<div class="userProperty"><strong>{/literal}{'Theme'|translate}{literal}</strong>';
182          userDetails += '<br><select name="theme">';
183          jQuery("#action select[name=theme] option").each(function() {
184            var selected = '';
185            if (user.theme == jQuery(this).val()) {
186              selected = ' selected="selected"';
187            }
188            userDetails += '<option value="'+jQuery(this).val()+'"'+selected+'>'+jQuery(this).html()+'</option>';
189          });
190          userDetails += '</select></div>';
191
192          userDetails += '<div class="userProperty"><strong>{/literal}{'Language'|translate}{literal}</strong>';
193          userDetails += '<br><select name="language">';
194          jQuery("#action select[name=language] option").each(function() {
195            var selected = '';
196            if (user.language == jQuery(this).val()) {
197              selected = ' selected="selected"';
198            }
199            userDetails += '<option value="'+jQuery(this).val()+'"'+selected+'>'+jQuery(this).html()+'</option>';
200          });
201          userDetails += '</select></div>';
202
203          userDetails += '<div class="userProperty"><strong>{/literal}{'Recent period'|translate}{literal}</strong>';
204          userDetails += '<br>'+user.recent_period+'</div>';
205
206          var checked = '';
207          if (user.expand == 'true') {
208            checked = ' checked="checked"';
209          }
210          userDetails += '<div class="userProperty"><label><input type="checkbox" name="expand"'+checked+'> <strong>{/literal}{'Expand all albums'|translate}{literal}</strong></label>';
211          userDetails += '</div>';
212
213          var checked = '';
214          if (user.show_nb_comments == 'true') {
215            checked = ' checked="checked"';
216          }
217          userDetails += '<div class="userProperty"><label><input type="checkbox" name="show_nb_comments"'+checked+'> <strong>{/literal}{'Show number of comments'|translate}{literal}</strong></label>';
218          userDetails += '</div>';
219
220          var checked = '';
221          if (user.show_nb_hits == 'true') {
222            checked = ' checked="checked"';
223          }
224          userDetails += '<div class="userProperty"><label><input type="checkbox" name="show_nb_hits"'+checked+'> <strong>{/literal}{'Show number of hits'|translate}{literal}</strong></label>';
225          userDetails += '</div>';
226          userDetails += '</div>';
227          userDetails += '<div style="clear:both"></div></div>';
228
229          userDetails += '<span class="infos" style="display:none">&#x2714; User updated</span>';
230          userDetails += '<input type="submit" value="{/literal}{'Save Settings'|translate}{literal}" style="display:none;" data-user_id="'+userId+'">';
231          userDetails += '<img class="submitWait" src="themes/default/images/ajax-loader-small.gif" style="display:none">'
232          userDetails += '</form>';
233
234          jQuery("#user"+userId).append(userDetails);
235          jQuery(".chzn-select").chosen();
236        }
237        else {
238          console.log('error loading user details');
239        }
240      },
241      error:function(XMLHttpRequest, textStatus, errorThrows) {
242        console.log('technical error loading user details');
243      }
244    });
245 
246    return '<div id="user'+userId+'" class="userProperties"><img class="loading" src="themes/default/images/ajax-loader-small.gif"></div>';
247  }
248
249  jQuery(document).on('change', '.userProperties input, .userProperties select',  function() {
250    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
251
252    jQuery('#user'+userId+' input[type=submit]').show();
253    jQuery('#user'+userId+' .infos').hide();
254  });
255
256  jQuery(document).on('click', '.userProperties input[type=submit]',  function() {
257    var userId = jQuery(this).data('user_id');
258
259    var formData = jQuery('#user'+userId+' form').serialize();
260
261    if (jQuery('#user'+userId+' form select[name="group_id[]"] option:selected').length == 0) {
262      formData += '&group_id=-1';
263    }
264
265    if (!jQuery('#user'+userId+' form input[name=enabled_high]').is(':checked')) {
266      formData += '&enabled_high=false';
267    }
268
269    if (!jQuery('#user'+userId+' form input[name=expand]').is(':checked')) {
270      formData += '&expand=false';
271    }
272
273    if (!jQuery('#user'+userId+' form input[name=show_nb_hits]').is(':checked')) {
274      formData += '&show_nb_hits=false';
275    }
276
277    if (!jQuery('#user'+userId+' form input[name=show_nb_comments]').is(':checked')) {
278      formData += '&show_nb_comments=false';
279    }
280
281    jQuery.ajax({
282      url: "ws.php?format=json&method=pwg.users.setInfo",
283      type:"POST",
284      data: formData,
285      beforeSend: function() {
286        jQuery('#user'+userId+' .submitWait').show();
287      },
288      success:function(data) {
289        jQuery('#user'+userId+' .submitWait').hide();
290        jQuery('#user'+userId+' input[type=submit]').hide();
291        jQuery('#user'+userId+' .infos').show();
292      },
293      error:function(XMLHttpRequest, textStatus, errorThrows) {
294        jQuery('#user'+userId+' .submitWait').hide();
295      }
296    });
297
298    return false;
299  });
300
301  /* Add event listener for opening and closing details
302   * Note that the indicator for showing which row is open is not controlled by DataTables,
303   * rather it is done here
304   */
305  jQuery(document).on('click', '#userList tbody td .openUserDetails',  function() {
306    var nTr = this.parentNode.parentNode;
307    if (jQuery(this).hasClass('icon-angle-circled-up')) {
308      /* This row is already open - close it */
309      jQuery(this).removeClass('icon-angle-circled-up').addClass('icon-angle-circled-down').attr('title', 'Open user details');
310      oTable.fnClose( nTr );
311    }
312    else {
313      /* Open this row */
314      jQuery(this).removeClass('icon-angle-circled-down').addClass('icon-angle-circled-up').attr('title', 'Close user details');
315      oTable.fnOpen( nTr, fnFormatDetails(oTable, nTr), 'details' );
316    }
317  });
318
319
320  /* first column must be prefixed with the open/close icon */
321  var aoColumns = [
322    {
323      'bVisible':false
324    },
325    {
326      "mRender": function(data, type, full) {
327        return '<span title="Open user details" class="icon-angle-circled-down openUserDetails"></span> <label><input type="checkbox" data-user_id="'+full[0]+'"> '+data+'</label>';
328      }
329    }
330  ];
331
332  for (i=2; i<jQuery("#userList thead tr th").length; i++) {
333    aoColumns.push(null);
334  }
335
336  var oTable = jQuery('#userList').dataTable({
337    "iDisplayLength": 10,
338    "bDeferRender": true,
339    "bProcessing": true,
340    "bServerSide": true,
341    "sAjaxSource": "admin/user_list_backend.php",
342    "oLanguage": {
343      "sProcessing":     "Traitement en cours...",
344      "sLengthMenu":     "Afficher _MENU_ éléments",
345      "sZeroRecords":    "Aucun élément à afficher",
346      "sInfo":           "Affichage des élements _START_ à _END_ sur _TOTAL_",
347      "sInfoEmpty":      "Affichage de l'élement 0 à 0 sur 0 éléments",
348      "sInfoFiltered":   "<br>(filtré de _MAX_ éléments au total{/literal}{if $is_a_guest} <span class='limitedVersionWarning'>dans la version complète</span>{/if}{literal})",
349      "sInfoPostFix":    "",
350      "sSearch":         "Rechercher",
351      "sLoadingRecords": "Téléchargement...",
352      "sUrl":            "",
353      "oPaginate": {
354          "sFirst":    "Premier",
355          "sPrevious": "← Précédent",
356          "sNext":     "Suivant →",
357          "sLast":     "Dernier"
358      }
359    },
360    "fnDrawCallback": function( oSettings ) {
361      jQuery("#userList input[type=checkbox]").each(function() {
362        var user_id = jQuery(this).data("user_id");
363        jQuery(this).prop('checked', (selection.indexOf(user_id) != -1));
364      });
365    },
366    "aoColumns": aoColumns
367  });
368
369  /**
370   * Selection management
371   */
372  function checkSelection() {
373    if (selection.length > 0) {
374      jQuery("#forbidAction").hide();
375      jQuery("#permitAction").show();
376
377      jQuery("#applyOnDetails").text(
378        sprintf(
379          applyOnDetails_pattern,
380          selection.length
381        )
382      );
383
384      if (selection.length == allUsers.length) {
385        jQuery("#selectedMessage").text(
386          sprintf(
387            selectedMessage_all,
388            allUsers.length
389          )
390        );
391      }
392      else {
393        jQuery("#selectedMessage").text(
394          sprintf(
395            selectedMessage_pattern,
396            selection.length,
397            allUsers.length
398          )
399        );
400      }
401    }
402    else {
403      jQuery("#forbidAction").show();
404      jQuery("#permitAction").hide();
405
406      jQuery("#selectedMessage").text(
407        sprintf(
408          selectedMessage_none,
409          allUsers.length
410        )
411      );
412    }
413
414    jQuery("#applyActionBlock .infos").hide();
415  }
416
417  jQuery(document).on('change', '#userList input[type=checkbox]',  function() {
418    var user_id = jQuery(this).data("user_id");
419
420    array_delete(selection, user_id);
421
422    if (jQuery(this).is(":checked")) {
423      selection.push(user_id);
424    }
425
426    checkSelection();
427  });
428
429  jQuery("#selectAll").click(function () {
430    selection = allUsers;
431    jQuery("#userList input[type=checkbox]").prop('checked', true);
432    checkSelection();
433    return false;
434  });
435
436  jQuery("#selectNone").click(function () {
437    selection = [];
438    jQuery("#userList input[type=checkbox]").prop('checked', false);
439    checkSelection();
440    return false;
441  });
442
443  jQuery("#selectInvert").click(function () {
444    var newSelection = [];
445    for(var i in allUsers)
446    {
447      if (selection.indexOf(allUsers[i]) == -1) {
448        newSelection.push(allUsers[i]);
449      }
450    }
451    selection = newSelection;
452
453    jQuery("#userList input[type=checkbox]").each(function() {
454      var user_id = jQuery(this).data("user_id");
455      jQuery(this).prop('checked', (selection.indexOf(user_id) != -1));
456    });
457
458    checkSelection();
459    return false;
460  });
461
462  /**
463   * Action management
464   */
465  jQuery("[id^=action_]").hide();
466 
467  jQuery("select[name=selectAction]").change(function () {
468    jQuery("#applyActionBlock .infos").hide();
469
470    jQuery("[id^=action_]").hide();
471
472    jQuery("#action_"+$(this).prop("value")).show();
473 
474    if (jQuery(this).val() != -1) {
475      jQuery("#applyActionBlock").show();
476    }
477    else {
478      jQuery("#applyActionBlock").hide();
479    }
480  });
481
482  jQuery("#permitAction input, #permitAction select").click(function() {
483    jQuery("#applyActionBlock .infos").hide();
484  });
485
486  jQuery("#applyAction").click(function() {
487    var action = jQuery("select[name=selectAction]").prop("value");
488    var method = 'pwg.users.setInfo';
489    var data = {
490      user_id: selection
491    };
492
493    switch (action) {
494      case 'delete':
495        if (!jQuery("input[name=confirm_deletion]").is(':checked')) {
496          alert(missingConfirm);
497          return false;
498        }
499        method = 'pwg.users.delete';
500        data.pwg_token = pwg_token;
501        break;
502      case 'group_associate':
503        method = 'pwg.groups.addUser';
504        data.group_id = jQuery("select[name=associate]").prop("value");
505        break;
506      case 'group_dissociate':
507        method = 'pwg.groups.deleteUser';
508        data.group_id = jQuery("select[name=dissociate]").prop("value");
509        break;
510      case 'status':
511        data.status = jQuery("select[name=status]").prop("value");
512        break;
513      case 'enabled_high':
514        data.enabled_high = jQuery("input[name=enabled_high]:checked").val();
515        break;
516      case 'level':
517        data.level = jQuery("select[name=level]").val();
518        break;
519      case 'nb_image_page':
520        data.nb_image_page = jQuery("input[name=nb_image_page]").val();
521        break;
522      case 'theme':
523        data.theme = jQuery("select[name=theme]").val();
524        break;
525      case 'language':
526        data.language = jQuery("select[name=language]").val();
527        break;
528      case 'recent_period':
529        data.recent_period = jQuery("input[name=recent_period]").val();
530        break;
531      case 'expand':
532        data.expand = jQuery("input[name=expand]:checked").val();
533        break;
534      case 'show_nb_comments':
535        data.show_nb_comments = jQuery("input[name=show_nb_comments]:checked").val();
536        break;
537      case 'show_nb_hits':
538        data.show_nb_hits = jQuery("input[name=show_nb_hits]:checked").val();
539        break;
540      default:
541        alert("Unexpected action");
542        return false;
543    }
544
545    jQuery.ajax({
546      url: "ws.php?format=json&method="+method,
547      type:"POST",
548      data: data,
549      beforeSend: function() {
550        jQuery("#applyActionLoading").show();
551      },
552      success:function(data) {
553        oTable.fnDraw();
554        jQuery("#applyActionLoading").hide();
555        jQuery("#applyActionBlock .infos").show();
556
557        if (action == 'delete') {
558          var allUsers_new = [];
559          for(var i in allUsers)
560          {
561            if (selection.indexOf(allUsers[i]) == -1) {
562              allUsers_new.push(allUsers[i]);
563            }
564          }
565          allUsers = allUsers_new;
566          console.log('allUsers_new.length = '+allUsers_new.length);
567          selection = [];
568          checkSelection();
569        }
570      },
571      error:function(XMLHttpRequest, textStatus, errorThrows) {
572        jQuery("#applyActionLoading").hide();
573      }
574    });
575
576    return false;
577  });
578
579});
580{/literal}{/footer_script}
581
582{literal}
583<style>
584.dataTables_wrapper, .dataTables_info {clear:none;}
585table.dataTable {clear:right;padding-top:10px;}
586.dataTable td img {margin-bottom: -6px;margin-left: -6px;}
587.paginate_enabled_previous, .paginate_enabled_previous:hover, .paginate_disabled_previous, .paginate_enabled_next, .paginate_enabled_next:hover, .paginate_disabled_next {background:none;}
588.paginate_enabled_previous, .paginate_enabled_next {color:#005E89 !important;}
589.paginate_enabled_previous:hover, .paginate_enabled_next:hover {color:#D54E21 !important; text-decoration:underline !important;}
590
591.paginate_disabled_next, .paginate_enabled_next {padding-right:3px;}
592.bulkAction {margin-top:10px;}
593#addUserForm p {margin-left:0;}
594#applyActionBlock .actionButtons {margin-left:0;}
595span.infos, span.errors {background-image:none; padding:2px 5px; margin:0;border-radius:5px;}
596
597.userProperties {max-width:730px;}
598.userPropertiesContainer {border-top:1px solid #ddd;margin-top:1em;}
599.userPropertiesSet {width:350px;float:left;padding-top:5px}
600.userPropertiesSetTitle {font-weight:bold;margin-bottom:1em;}
601.userPrefs {border-left:1px solid #ddd;padding-left:10px;}
602.userProperty {width:220px;float:left;margin-bottom:15px;}
603
604.userActions {float:right;text-align:right;}
605</style>
606{/literal}
607
608<div class="titrePage">
609  <h2>{'User list'|@translate}</h2>
610</div>
611
612<p class="showCreateAlbum" id="showAddUser">
613  <a href="#" id="addUser" class="icon-plus-circled">{'Add a user'|translate}</a>
614  <span class="infos" style="display:none"></span>
615</p>
616
617<form id="addUserForm" style="display:none" method="post" name="add_user" action="{$F_ADD_ACTION}">
618  <fieldset>
619    <legend>{'Add a user'|@translate}</legend>
620
621    <p>
622      <strong>{'Username'|translate}</strong><br>
623      <input type="text" name="username" maxlength="50" size="20">
624    </p>
625
626    <p>
627      <strong>{'Password'|translate}</strong><br>
628      <input type="{if $Double_Password}password{else}text{/if}" name="password">
629    </p>
630   
631{if $Double_Password}
632    <p>
633      <strong>{'Confirm Password'|@translate}</strong><br>
634      <input type="password" name="password_confirm">
635    </p>
636{/if}
637
638    <p>
639      <strong>{'Email address'|@translate}</strong><br>
640      <input type="text" name="email">
641    </p>
642
643    <p>
644      <label><input type="checkbox" name="send_password_by_mail"> <strong>{'Send connection settings by email'|@translate}</strong></label>
645    </p>
646
647    <p class="actionButtons">
648      <input class="submit" name="submit_add" type="submit" value="{'Submit'|@translate}">
649      <a href="#" id="addUserClose">{'Cancel'|@translate}</a>
650      <span class="loading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
651      <span class="errors" style="display:none"></span>
652    </p>
653  </fieldset>
654</form>
655
656<form method="post" name="preferences" action="">
657
658<table id="userList">
659  <thead>
660    <tr>
661      <th>id</th>
662      <th>{'Username'|@translate}</th>
663      <th>{'Status'|@translate}</th>
664      <th>{'Email address'|@translate}</th>
665      <th>{'registration date'|@translate}</th>
666    </tr>
667  </thead>
668</table>
669
670<div style="clear:right"></div>
671
672<p class="checkActions">
673  {'Select:'|@translate}
674  <a href="#" id="selectAll">{'All'|@translate}</a>,
675  <a href="#" id="selectNone">{'None'|@translate}</a>,
676  <a href="#" id="selectInvert">{'Invert'|@translate}</a>
677
678  <span id="selectedMessage"></span>
679</p>
680
681<fieldset id="action">
682  <legend>{'Action'|@translate}</legend>
683
684  <div id="forbidAction"{if count($selection) != 0} style="display:none"{/if}>{'No user selected, no action possible.'|@translate}</div>
685  <div id="permitAction"{if count($selection) == 0} style="display:none"{/if}>
686
687    <select name="selectAction">
688      <option value="-1">{'Choose an action'|@translate}</option>
689      <option disabled="disabled">------------------</option>
690      <option value="delete" class="icon-trash">{'Delete selected users'|@translate}</option>
691      <option value="status">{'Status'|@translate}</option>
692      <option value="group_associate">{'associate to group'|translate}</option>
693      <option value="group_dissociate">{'dissociate from group'|@translate}</option>
694      <option value="enabled_high">{'High definition enabled'|@translate}</option>
695      <option value="level">{'Privacy level'|@translate}</option>
696      <option value="nb_image_page">{'Number of photos per page'|@translate}</option>
697      <option value="theme">{'Interface theme'|@translate}</option>
698      <option value="language">{'Language'|@translate}</option>
699      <option value="recent_period">{'Recent period'|@translate}</option>
700      <option value="expand">{'Expand all albums'|@translate}</option>
701{if $ACTIVATE_COMMENTS}
702      <option value="show_nb_comments">{'Show number of comments'|@translate}</option>
703{/if}
704      <option value="show_nb_hits">{'Show number of hits'|@translate}</option>
705    </select>
706
707    {* delete *}
708    <div id="action_delete" class="bulkAction">
709      <p><label><input type="checkbox" name="confirm_deletion" value="1"> {'Are you sure?'|@translate}</label></p>
710    </div>
711
712    {* status *}
713    <div id="action_status" class="bulkAction">
714      <select name="status">
715        {html_options options=$pref_status_options selected=$pref_status_selected}
716      </select>
717    </div>
718
719    {* group_associate *}
720    <div id="action_group_associate" class="bulkAction">
721      {html_options name=associate options=$association_options selected=$associate_selected}
722    </div>
723
724    {* group_dissociate *}
725    <div id="action_group_dissociate" class="bulkAction">
726      {html_options name=dissociate options=$association_options selected=$dissociate_selected}
727    </div>
728
729    {* enabled_high *}
730    <div id="action_enabled_high" class="bulkAction">
731      <label><input type="radio" name="enabled_high" value="true">{'Yes'|@translate}</label>
732      <label><input type="radio" name="enabled_high" value="false" checked="checked">{'No'|@translate}</label>
733    </div>
734
735    {* level *}
736    <div id="action_level" class="bulkAction">
737      <select name="level" size="1">
738        {html_options options=$level_options selected=$level_selected}
739      </select>
740    </div>
741
742    {* nb_image_page *}
743    <div id="action_nb_image_page" class="bulkAction">
744      <input size="4" maxlength="3" type="text" name="nb_image_page" value="{$NB_IMAGE_PAGE}">
745    </div>
746
747    {* theme *}
748    <div id="action_theme" class="bulkAction">
749      <select name="theme" size="1">
750        {html_options options=$theme_options selected=$theme_selected}
751      </select>
752    </div>
753
754    {* language *}
755    <div id="action_language" class="bulkAction">
756      <select name="language" size="1">
757        {html_options options=$language_options selected=$language_selected}
758      </select>
759    </div>
760
761    {* recent_period *}
762    <div id="action_recent_period" class="bulkAction">
763      <input type="text" size="3" maxlength="2" name="recent_period" value="{$RECENT_PERIOD}">
764    </div>
765
766    {* expand *}
767    <div id="action_expand" class="bulkAction">
768      <label><input type="radio" name="expand" value="true">{'Yes'|@translate}</label>
769      <label><input type="radio" name="expand" value="false" checked="checked">{'No'|@translate}</label>
770    </div>
771
772    {* show_nb_comments *}
773    <div id="action_show_nb_comments" class="bulkAction">
774      <label><input type="radio" name="show_nb_comments" value="true">{'Yes'|@translate}</label>
775      <label><input type="radio" name="show_nb_comments" value="false" checked="checked">{'No'|@translate}</label>
776    </div>
777
778    {* show_nb_hits *}
779    <div id="action_show_nb_hits" class="bulkAction">
780      <label><input type="radio" name="show_nb_hits" value="true">{'Yes'|@translate}</label>
781      <label><input type="radio" name="show_nb_hits" value="false" checked="checked">{'No'|@translate}</label>
782    </div>
783
784    <p id="applyActionBlock" style="display:none" class="actionButtons">
785      <input id="applyAction" class="submit" type="submit" value="{'Apply action'|@translate}" name="submit"> <span id="applyOnDetails"></span>
786      <span id="applyActionLoading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
787      <span class="infos" style="display:none">&#x2714; Users modified</span>
788    </p>
789
790  </div> {* #permitAction *}
791</fieldset>
792
793</form>
Note: See TracBrowser for help on using the repository browser.