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

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

feature 1668: visual enhancement for user manager redesign. Appropriate
(fontello) icons for open/close user details, appropriate colors for
DataTables.

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