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

Last change on this file since 28555 was 28555, checked in by mistic100, 10 years ago

feature 3077 : fix addAlbum process when creating the first ever album, improve data API

  • Property svn:eol-style set to LF
File size: 41.2 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.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
7{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.default.css"}
8
9{combine_script id='jquery.underscore' load='footer' path='themes/default/js/plugins/underscore.js'}
10
11{combine_script id='jquery.ui.slider' require='jquery.ui' load='footer' path='themes/default/js/ui/minified/jquery.ui.slider.min.js'}
12{combine_css path="themes/default/js/ui/theme/jquery.ui.slider.css"}
13
14{footer_script}
15var selectedMessage_pattern = "{'%d of %d users selected'|translate|escape:javascript}";
16var selectedMessage_none = "{'No user selected of %d users'|translate|escape:javascript}";
17var selectedMessage_all = "{'All %d users are selected'|translate|escape:javascript}";
18var applyOnDetails_pattern = "{'on the %d selected users'|translate|escape:javascript}";
19var newUser_pattern = "✔ {'User %s added'|translate|escape:javascript}";
20var registeredOn_pattern = "{'Registered on %s, %s.'|translate|escape:javascript}";
21var lastVisit_pattern = "{'Last visit on %s, %s.'|translate|escape:javascript}";
22var missingConfirm = "{'You need to confirm deletion'|translate|escape:javascript}";
23var missingUsername = "{'Please, enter a login'|translate|escape:javascript}";
24
25var allUsers = [{$all_users}];
26var selection = [{$selection}];
27var pwg_token = "{$PWG_TOKEN}";
28
29var protectedUsers = [{$protected_users}];
30var guestUser = {$guest_user};
31
32var truefalse = {
33  'true':"{'Yes'|translate}",
34  'false':"{'No'|translate}",
35};
36{/footer_script}
37
38{footer_script}{literal}
39jQuery(document).ready(function() {
40  /**
41   * Add user
42   */
43  jQuery("#addUser").click(function() {
44    jQuery("#addUserForm").toggle();
45    jQuery("#showAddUser .infos").hide();
46    jQuery("input[name=username]").focus();
47    return false;
48  });
49
50  jQuery("#addUserClose").click(function() {
51    jQuery("#addUserForm").hide();
52    return false;
53  });
54
55  jQuery("#addUserForm").submit(function() {
56    jQuery.ajax({
57      url: "ws.php?format=json&method=pwg.users.add",
58      type:"POST",
59      data: jQuery(this).serialize()+"&pwg_token="+pwg_token,
60      beforeSend: function() {
61        jQuery("#addUserForm .errors").hide();
62
63        if (jQuery("input[name=username]").val() == "") {
64          jQuery("#addUserForm .errors").html('✘ '+missingUsername).show();
65          return false;
66        }
67
68        jQuery("#addUserForm .loading").show();
69      },
70      success:function(data) {
71        oTable.fnDraw();
72        jQuery("#addUserForm .loading").hide();
73
74        var data = jQuery.parseJSON(data);
75        if (data.stat == 'ok') {
76          jQuery("#addUserForm input[type=text], #addUserForm input[type=password]").val("");
77
78          var new_user = data.result.users[0];
79          allUsers.push(parseInt(new_user.id));
80          jQuery("#showAddUser .infos").html(sprintf(newUser_pattern, new_user.username)).show();
81          checkSelection();
82
83          jQuery("#addUserForm").hide();
84        }
85        else {
86          jQuery("#addUserForm .errors").html('✘ '+data.message).show();
87        }
88      },
89      error:function(XMLHttpRequest, textStatus, errorThrows) {
90        jQuery("#addUserForm .loading").hide();
91      }
92    });
93
94    return false;
95  });
96
97  /**
98   * Table with users
99   */
100  /**
101   * find the key from a value in the startStopValues array
102   */
103  function getSliderKeyFromValue(value, values) {
104    for (var key in values) {
105      if (values[key] >= value) {
106        return key;
107      }
108    }
109    return 0;
110  }
111
112  var recent_period_values = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,30,40,50,60,80,99];
113
114  function getRecentPeriodInfoFromIdx(idx) {
115    return sprintf(
116      "{/literal}{'%d days'|@translate}{literal}",
117      recent_period_values[idx]
118    );
119  }
120
121  var nb_image_page_values = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,35,40,45,50,60,70,80,90,100,200,300,500,999];
122
123  function getNbImagePageInfoFromIdx(idx) {
124    return sprintf(
125      "{/literal}{'%d photos per page'|@translate}{literal}",
126      nb_image_page_values[idx]
127    );
128  }
129
130  /* nb_image_page slider */
131  var nb_image_page_init = getSliderKeyFromValue(jQuery('#action_nb_image_page input[name=nb_image_page]').val(), nb_image_page_values);
132 
133  jQuery('#action_nb_image_page .nb_image_page_infos').html(getNbImagePageInfoFromIdx(nb_image_page_init));
134 
135  jQuery('#action_nb_image_page .nb_image_page').slider({
136    range: "min",
137    min: 0,
138    max: nb_image_page_values.length - 1,
139    value: nb_image_page_init,
140    slide: function( event, ui ) {
141      jQuery('#action_nb_image_page .nb_image_page_infos').html(getNbImagePageInfoFromIdx(ui.value));
142    },
143    stop: function( event, ui ) {
144      jQuery('#action_nb_image_page input[name=nb_image_page]').val(nb_image_page_values[ui.value]).trigger('change');
145    }
146  });
147
148  /* recent_period slider */
149  var recent_period_init = getSliderKeyFromValue(jQuery('#action_recent_period input[name=recent_period]').val(), recent_period_values);
150  jQuery('#action_recent_period .recent_period_infos').html(getRecentPeriodInfoFromIdx(recent_period_init));
151 
152  jQuery('#action_recent_period .recent_period').slider({
153    range: "min",
154    min: 0,
155    max: recent_period_values.length - 1,
156    value: recent_period_init,
157    slide: function( event, ui ) {
158      jQuery('#action_recent_period .recent_period_infos').html(getRecentPeriodInfoFromIdx(ui.value));
159    },
160    stop: function( event, ui ) {
161      jQuery('#action_recent_period input[name=recent_period]').val(recent_period_values[ui.value]).trigger('change');
162    }
163  });
164
165  /* Formating function for row details */
166  function fnFormatDetails(oTable, nTr) {
167    var userId = oTable.fnGetData(nTr)[0];
168    console.log("userId = "+userId);
169    var sOut = null;
170
171    jQuery.ajax({
172      url: "ws.php?format=json&method=pwg.users.getList",
173      type:"POST",
174      data: {
175        user_id: userId,
176        display: "all",
177      },
178      success:function(data) {
179        jQuery("#user"+userId+" .loading").hide();
180
181        var data = jQuery.parseJSON(data);
182        if (data.stat == 'ok') {
183          var user = data.result.users[0];
184
185          /* Prepare data for template */
186          user.statusOptions = [];
187          jQuery("#action select[name=status] option").each(function() {
188            var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
189         
190            if (user.status == jQuery(this).val()) {
191              option.isSelected = true;
192            }
193         
194            user.statusOptions.push(option);
195          });
196         
197          user.levelOptions = [];
198          jQuery("#action select[name=level] option").each(function() {
199            var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
200         
201            if (user.level == jQuery(this).val()) {
202              option.isSelected = true;
203            }
204         
205            user.levelOptions.push(option);
206          });
207         
208          user.groupOptions = [];
209          jQuery("#action select[name=associate] option").each(function() {
210            var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
211         
212            if (user.groups.indexOf( parseInt(jQuery(this).val()) ) != -1) {
213              option.isSelected = true;
214            }
215         
216            user.groupOptions.push(option);
217          });
218         
219          user.themeOptions = [];
220          jQuery("#action select[name=theme] option").each(function() {
221            var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
222         
223            if (user.theme == jQuery(this).val()) {
224              option.isSelected = true;
225            }
226         
227            user.themeOptions.push(option);
228          });
229         
230          user.languageOptions = [];
231          jQuery("#action select[name=language] option").each(function() {
232            var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
233         
234            if (user.language == jQuery(this).val()) {
235              option.isSelected = true;
236            }
237         
238            user.languageOptions.push(option);
239          });
240         
241          user.isGuest = (parseInt(userId) == guestUser);
242          user.isProtected = (protectedUsers.indexOf(parseInt(userId)) != -1);
243         
244          user.registeredOn_string = sprintf(
245            registeredOn_pattern,
246            user.registration_date_string,
247            user.registration_date_since
248          );
249         
250          user.lastVisit_string = "";
251          if (typeof user.last_visit != 'undefined') {
252            user.lastVisit_string = sprintf(lastVisit_pattern, user.last_visit_string, user.last_visit_since);
253          }
254         
255          user.updateString = sprintf(
256            "{/literal}{'User %s updated'|translate|escape:javascript}{literal}",
257            user.username
258          );
259         
260          user.email = user.email || '';
261         
262          jQuery("#action select[name=status] option").each(function() {
263            if (user.status == jQuery(this).val()) {
264              user.statusLabel = jQuery(this).html();
265            }
266          });
267         
268                      /* Render the underscore template */
269          _.templateSettings.variable = "user";
270         
271          var template = _.template(
272            jQuery("script.userDetails").html()
273                      );
274         
275          jQuery("#user"+userId).append(template(user));
276
277          /* groups select */
278          jQuery('[data-selectize=groups]').selectize({
279            valueField: 'value',
280            labelField: 'label',
281            searchField: ['label'],
282            plugins: ['remove_button']
283          });
284
285          var groupSelectize = jQuery('[data-selectize=groups]')[0].selectize;
286
287          groupSelectize.load(function(callback) {
288            callback(user.groupOptions);
289          });
290
291          jQuery.each(jQuery.grep(user.groupOptions, function(group) {
292            return group.isSelected;
293          }), function(i, group) {
294            groupSelectize.addItem(group.value);
295          });
296
297          /* nb_image_page slider */
298          var nb_image_page_init = getSliderKeyFromValue(jQuery('#user'+userId+' input[name=nb_image_page]').val(), nb_image_page_values);
299         
300          jQuery('#user'+userId+' .nb_image_page_infos').html(getNbImagePageInfoFromIdx(nb_image_page_init));
301         
302          jQuery('#user'+userId+' .nb_image_page').slider({
303            range: "min",
304            min: 0,
305            max: nb_image_page_values.length - 1,
306            value: nb_image_page_init,
307            slide: function( event, ui ) {
308              jQuery('#user'+userId+' .nb_image_page_infos').html(getNbImagePageInfoFromIdx(ui.value));
309            },
310            stop: function( event, ui ) {
311              jQuery('#user'+userId+' input[name=nb_image_page]').val(nb_image_page_values[ui.value]).trigger('change');
312            }
313          });
314
315          /* recent_period slider */
316          var recent_period_init = getSliderKeyFromValue(jQuery('#user'+userId+' input[name=recent_period]').val(), recent_period_values);
317          jQuery('#user'+userId+' .recent_period_infos').html(getRecentPeriodInfoFromIdx(recent_period_init));
318         
319          jQuery('#user'+userId+' .recent_period').slider({
320            range: "min",
321            min: 0,
322            max: recent_period_values.length - 1,
323            value: recent_period_init,
324            slide: function( event, ui ) {
325              jQuery('#user'+userId+' .recent_period_infos').html(getRecentPeriodInfoFromIdx(ui.value));
326            },
327            stop: function( event, ui ) {
328              jQuery('#user'+userId+' input[name=recent_period]').val(recent_period_values[ui.value]).trigger('change');
329            }
330          });
331        }
332        else {
333          console.log('error loading user details');
334        }
335      },
336      error:function(XMLHttpRequest, textStatus, errorThrows) {
337        console.log('technical error loading user details');
338      }
339    });
340 
341    return '<div id="user'+userId+'" class="userProperties"><img class="loading" src="themes/default/images/ajax-loader-small.gif"></div>';
342  }
343
344  /* change password */
345  jQuery(document).on('click', '.changePasswordOpen',  function() {
346    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
347
348    jQuery(this).hide();
349    jQuery('#user'+userId+' .changePasswordDone').hide();
350    jQuery('#user'+userId+' .changePassword').show();
351    jQuery('#user'+userId+' .changePassword input[type=text]').focus();
352
353    return false;
354  });
355
356  jQuery(document).on('click', '.changePassword a.updatePassword',  function() {
357    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
358
359    jQuery('#user'+userId+' .changePassword a .text').hide();
360    jQuery('#user'+userId+' .changePassword a img').show();
361
362    jQuery.ajax({
363      url: "ws.php?format=json&method=pwg.users.setInfo",
364      type:"POST",
365      data: {
366        pwg_token:pwg_token,
367        user_id:userId,
368        password: jQuery('#user'+userId+' .changePassword input[type=text]').val()
369      },
370      beforeSend: function() {
371        jQuery('#user'+userId+' .changePassword input[type=text]').val("");
372      },
373      success:function(data) {
374        jQuery('#user'+userId+' .changePassword a .text').show();
375        jQuery('#user'+userId+' .changePassword a img').hide();
376        jQuery('#user'+userId+' .changePassword').hide();
377        jQuery('#user'+userId+' .changePasswordOpen').show();
378        jQuery('#user'+userId+' .changePasswordDone').show();
379      },
380      error:function(XMLHttpRequest, textStatus, errorThrows) {
381      }
382    });
383
384    return false;
385  });
386
387  jQuery(document).on('click', '.changePassword a.cancel',  function() {
388    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
389
390    jQuery('#user'+userId+' .changePassword').hide();
391    jQuery('#user'+userId+' .changePasswordOpen').show();
392
393    return false;
394  });
395
396  /* change username */
397  jQuery(document).on('click', '.changeUsernameOpen a',  function() {
398    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
399    var username = jQuery('#user'+userId+' .username').html();
400
401    jQuery('#user'+userId+' .changeUsernameOpen').hide();
402    jQuery('#user'+userId+' .changeUsername').show();
403    jQuery('#user'+userId+' .changeUsername input[type=text]').val(username).focus();
404
405    return false;
406  });
407
408  jQuery(document).on('click', 'a.updateUsername',  function() {
409    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
410
411    jQuery('#user'+userId+' .changeUsername a .text').hide();
412    jQuery('#user'+userId+' .changeUsername a img').show();
413
414    jQuery.ajax({
415      url: "ws.php?format=json&method=pwg.users.setInfo",
416      type:"POST",
417      data: {
418        pwg_token:pwg_token,
419        user_id:userId,
420        username: jQuery('#user'+userId+' .changeUsername input[type=text]').val()
421      },
422      success:function(data) {
423        jQuery('#user'+userId+' .changeUsername a .text').show();
424        jQuery('#user'+userId+' .changeUsername a img').hide();
425        jQuery('#user'+userId+' .changeUsername').hide();
426        jQuery('#user'+userId+' .changeUsernameOpen').show();
427
428        var data = jQuery.parseJSON(data);
429        jQuery('#user'+userId+' .username').html(data.result.users[0].username);
430      },
431      error:function(XMLHttpRequest, textStatus, errorThrows) {
432      }
433    });
434
435    return false;
436  });
437
438  jQuery(document).on('click', '.changeUsername a.cancel',  function() {
439    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
440
441    jQuery('#user'+userId+' .changeUsername').hide();
442    jQuery('#user'+userId+' .changeUsernameOpen').show();
443
444    return false;
445  });
446
447  /* display the "save" button when a field changes */
448  jQuery(document).on('change', '.userProperties input, .userProperties select',  function() {
449    var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
450
451    jQuery('#user'+userId+' input[type=submit]').show();
452    jQuery('#user'+userId+' .propertiesUpdateDone').hide();
453  });
454
455  /* delete user */
456  jQuery(document).on('click', '.userDelete a',  function() {
457    if (!confirm("{/literal}{'Are you sure?'|translate|escape:javascript}{literal}")) {
458      return false;
459    }
460
461    var userId = jQuery(this).data('user_id');
462    var username = jQuery('#user'+userId+' .username').html();
463
464    jQuery.ajax({
465      url: "ws.php?format=json&method=pwg.users.delete",
466      type:"POST",
467      data: {
468        user_id:userId,
469        pwg_token:pwg_token
470      },
471      beforeSend: function() {
472        jQuery('#user'+userId+' .userDelete .loading').show();
473      },
474      success:function(data) {
475        oTable.fnDraw();
476        jQuery('#showAddUser .infos').html('&#x2714; User '+username+' deleted').show();
477      },
478      error:function(XMLHttpRequest, textStatus, errorThrows) {
479        jQuery('#user'+userId+' .userDelete .loading').hide();
480      }
481    });
482
483    return false;
484  });
485
486  jQuery(document).on('click', '.userProperties input[type=submit]',  function() {
487    var userId = jQuery(this).data('user_id');
488
489    var formData = jQuery('#user'+userId+' form').serialize();
490    formData += '&pwg_token='+pwg_token;
491
492    if (jQuery('#user'+userId+' form select[name="group_id[]"] option:selected').length == 0) {
493      formData += '&group_id=-1';
494    }
495
496    if (!jQuery('#user'+userId+' form input[name=enabled_high]').is(':checked')) {
497      formData += '&enabled_high=false';
498    }
499
500    if (!jQuery('#user'+userId+' form input[name=expand]').is(':checked')) {
501      formData += '&expand=false';
502    }
503
504    if (!jQuery('#user'+userId+' form input[name=show_nb_hits]').is(':checked')) {
505      formData += '&show_nb_hits=false';
506    }
507
508    if (!jQuery('#user'+userId+' form input[name=show_nb_comments]').is(':checked')) {
509      formData += '&show_nb_comments=false';
510    }
511
512    jQuery.ajax({
513      url: "ws.php?format=json&method=pwg.users.setInfo",
514      type:"POST",
515      data: formData,
516      beforeSend: function() {
517        jQuery('#user'+userId+' .submitWait').show();
518      },
519      success:function(data) {
520        jQuery('#user'+userId+' .submitWait').hide();
521        jQuery('#user'+userId+' input[type=submit]').hide();
522        jQuery('#user'+userId+' .propertiesUpdateDone').show();
523      },
524      error:function(XMLHttpRequest, textStatus, errorThrows) {
525        jQuery('#user'+userId+' .submitWait').hide();
526      }
527    });
528
529    return false;
530  });
531
532  /* Add event listener for opening and closing details
533   * Note that the indicator for showing which row is open is not controlled by DataTables,
534   * rather it is done here
535   */
536  jQuery(document).on('click', '#userList tbody td .openUserDetails',  function() {
537    var nTr = this.parentNode.parentNode;
538    if (jQuery(this).hasClass('icon-cancel-circled')) {
539      /* This row is already open - close it */
540      jQuery(this)
541        .removeClass('icon-cancel-circled')
542        .addClass('icon-pencil')
543        .attr('title', "{/literal}{'Open user details'|translate|escape:'javascript'}{literal}")
544        .html("{/literal}{'edit'|translate|escape:'javascript'}{literal}")
545      ;
546
547      oTable.fnClose( nTr );
548    }
549    else {
550      /* Open this row */
551      jQuery(this)
552        .removeClass('icon-pencil')
553        .addClass('icon-cancel-circled')
554        .attr('title', "{/literal}{'Close user details'|translate|escape:'javascript'}{literal}")
555        .html("{/literal}{'close'|translate|escape:'javascript'}{literal}")
556      ;
557
558      oTable.fnOpen( nTr, fnFormatDetails(oTable, nTr), 'details' );
559    }
560  });
561
562
563  /* first column must be prefixed with the open/close icon */
564  var aoColumns = [
565    {
566      'bVisible':false
567    },
568    {
569      "mRender": function(data, type, full) {
570        return '<label><input type="checkbox" data-user_id="'+full[0]+'"> '+data+'</label> <a title="{/literal}{'Open user details'|translate|escape:'javascript'}{literal}" class="icon-pencil openUserDetails">{/literal}{'edit'|translate}{literal}</a>';
571      }
572    }
573  ];
574
575  for (i=2; i<jQuery("#userList thead tr th").length; i++) {
576    aoColumns.push(null);
577  }
578
579  var oTable = jQuery('#userList').dataTable({
580    "iDisplayLength": 10,
581    "bDeferRender": true,
582    "bProcessing": true,
583    "bServerSide": true,
584                "sServerMethod": "POST",
585    "sAjaxSource": "admin/user_list_backend.php",
586    "oLanguage": {
587      "sProcessing": "{/literal}{'Loading...'|translate|escape:'javascript'}{literal}",
588      "sLengthMenu": sprintf("{/literal}{'Show %s users'|translate|escape:'javascript'}{literal}", '_MENU_'),
589      "sZeroRecords": "{/literal}{'No matching user found'|translate|escape:'javascript'}{literal}",
590      "sInfo": sprintf("{/literal}{'Showing %s to %s of %s users'|translate|escape:'javascript'}{literal}", '_START_', '_END_', '_TOTAL_'),
591      "sInfoEmpty": "{/literal}{'No matching user found'|translate|escape:'javascript'}{literal}",
592      "sInfoFiltered": sprintf("{/literal}{'(filtered from %s total users)'|translate|escape:'javascript'}{literal}", '_MAX_'),
593      "sSearch": '<span class="icon-search"></span>'+"{/literal}{'Search'|translate|escape:'javascript'}{literal}",
594      "sLoadingRecords": "{/literal}{'Loading...'|translate|escape:'javascript'}{literal}",
595      "oPaginate": {
596          "sFirst":    "{/literal}{'First'|translate|escape:'javascript'}{literal}",
597          "sPrevious": '← '+"{/literal}{'Previous'|translate|escape:'javascript'}{literal}",
598          "sNext":     "{/literal}{'Next'|translate|escape:'javascript'}{literal}"+' →',
599          "sLast":     "{/literal}{'Last'|translate|escape:'javascript'}{literal}",
600      }
601    },
602    "fnDrawCallback": function( oSettings ) {
603      jQuery("#userList input[type=checkbox]").each(function() {
604        var user_id = jQuery(this).data("user_id");
605        jQuery(this).prop('checked', (selection.indexOf(user_id) != -1));
606      });
607    },
608    "aoColumns": aoColumns
609  });
610
611  /**
612   * Selection management
613   */
614  function checkSelection() {
615    if (selection.length > 0) {
616      jQuery("#forbidAction").hide();
617      jQuery("#permitAction").show();
618
619      jQuery("#applyOnDetails").text(
620        sprintf(
621          applyOnDetails_pattern,
622          selection.length
623        )
624      );
625
626      if (selection.length == allUsers.length) {
627        jQuery("#selectedMessage").text(
628          sprintf(
629            selectedMessage_all,
630            allUsers.length
631          )
632        );
633      }
634      else {
635        jQuery("#selectedMessage").text(
636          sprintf(
637            selectedMessage_pattern,
638            selection.length,
639            allUsers.length
640          )
641        );
642      }
643    }
644    else {
645      jQuery("#forbidAction").show();
646      jQuery("#permitAction").hide();
647
648      jQuery("#selectedMessage").text(
649        sprintf(
650          selectedMessage_none,
651          allUsers.length
652        )
653      );
654    }
655
656    jQuery("#applyActionBlock .infos").hide();
657  }
658
659  jQuery(document).on('change', '#userList input[type=checkbox]',  function() {
660    var user_id = jQuery(this).data("user_id");
661
662    array_delete(selection, user_id);
663
664    if (jQuery(this).is(":checked")) {
665      selection.push(user_id);
666    }
667
668    checkSelection();
669  });
670
671  jQuery("#selectAll").click(function () {
672    selection = allUsers;
673    jQuery("#userList input[type=checkbox]").prop('checked', true);
674    checkSelection();
675    return false;
676  });
677
678  jQuery("#selectNone").click(function () {
679    selection = [];
680    jQuery("#userList input[type=checkbox]").prop('checked', false);
681    checkSelection();
682    return false;
683  });
684
685  jQuery("#selectInvert").click(function () {
686    var newSelection = [];
687    for(var i in allUsers)
688    {
689      if (selection.indexOf(allUsers[i]) == -1) {
690        newSelection.push(allUsers[i]);
691      }
692    }
693    selection = newSelection;
694
695    jQuery("#userList input[type=checkbox]").each(function() {
696      var user_id = jQuery(this).data("user_id");
697      jQuery(this).prop('checked', (selection.indexOf(user_id) != -1));
698    });
699
700    checkSelection();
701    return false;
702  });
703
704  /**
705   * Action management
706   */
707  jQuery("[id^=action_]").hide();
708 
709  jQuery("select[name=selectAction]").change(function () {
710    jQuery("#applyActionBlock .infos").hide();
711
712    jQuery("[id^=action_]").hide();
713
714    jQuery("#action_"+$(this).prop("value")).show();
715 
716    if (jQuery(this).val() != -1) {
717      jQuery("#applyActionBlock").show();
718    }
719    else {
720      jQuery("#applyActionBlock").hide();
721    }
722  });
723
724  jQuery("#permitAction input, #permitAction select").click(function() {
725    jQuery("#applyActionBlock .infos").hide();
726  });
727
728  jQuery("#applyAction").click(function() {
729    var action = jQuery("select[name=selectAction]").prop("value");
730    var method = 'pwg.users.setInfo';
731    var data = {
732      pwg_token: pwg_token,
733      user_id: selection
734    };
735
736    switch (action) {
737      case 'delete':
738        if (!jQuery("input[name=confirm_deletion]").is(':checked')) {
739          alert(missingConfirm);
740          return false;
741        }
742        method = 'pwg.users.delete';
743        break;
744      case 'group_associate':
745        method = 'pwg.groups.addUser';
746        data.group_id = jQuery("select[name=associate]").prop("value");
747        break;
748      case 'group_dissociate':
749        method = 'pwg.groups.deleteUser';
750        data.group_id = jQuery("select[name=dissociate]").prop("value");
751        break;
752      case 'status':
753        data.status = jQuery("select[name=status]").prop("value");
754        break;
755      case 'enabled_high':
756        data.enabled_high = jQuery("input[name=enabled_high]:checked").val();
757        break;
758      case 'level':
759        data.level = jQuery("select[name=level]").val();
760        break;
761      case 'nb_image_page':
762        data.nb_image_page = jQuery("input[name=nb_image_page]").val();
763        break;
764      case 'theme':
765        data.theme = jQuery("select[name=theme]").val();
766        break;
767      case 'language':
768        data.language = jQuery("select[name=language]").val();
769        break;
770      case 'recent_period':
771        data.recent_period = jQuery("input[name=recent_period]").val();
772        break;
773      case 'expand':
774        data.expand = jQuery("input[name=expand]:checked").val();
775        break;
776      case 'show_nb_comments':
777        data.show_nb_comments = jQuery("input[name=show_nb_comments]:checked").val();
778        break;
779      case 'show_nb_hits':
780        data.show_nb_hits = jQuery("input[name=show_nb_hits]:checked").val();
781        break;
782      default:
783        alert("Unexpected action");
784        return false;
785    }
786
787    jQuery.ajax({
788      url: "ws.php?format=json&method="+method,
789      type:"POST",
790      data: data,
791      beforeSend: function() {
792        jQuery("#applyActionLoading").show();
793      },
794      success:function(data) {
795        oTable.fnDraw();
796        jQuery("#applyActionLoading").hide();
797        jQuery("#applyActionBlock .infos").show();
798
799        if (action == 'delete') {
800          var allUsers_new = [];
801          for(var i in allUsers)
802          {
803            if (selection.indexOf(allUsers[i]) == -1) {
804              allUsers_new.push(allUsers[i]);
805            }
806          }
807          allUsers = allUsers_new;
808          console.log('allUsers_new.length = '+allUsers_new.length);
809          selection = [];
810          checkSelection();
811        }
812      },
813      error:function(XMLHttpRequest, textStatus, errorThrows) {
814        jQuery("#applyActionLoading").hide();
815      }
816    });
817
818    return false;
819  });
820
821});
822{/literal}{/footer_script}
823
824{html_style}{literal}
825.dataTables_wrapper, .dataTables_info {clear:none;}
826table.dataTable {clear:right;padding-top:10px;}
827.dataTable td img {margin-bottom: -6px;margin-left: -6px;}
828.paginate_enabled_previous, .paginate_enabled_previous:hover, .paginate_disabled_previous, .paginate_enabled_next, .paginate_enabled_next:hover, .paginate_disabled_next {background:none;}
829.paginate_enabled_previous, .paginate_enabled_next {color:#005E89 !important;}
830.paginate_enabled_previous:hover, .paginate_enabled_next:hover {color:#D54E21 !important; text-decoration:underline !important;}
831
832.paginate_disabled_next, .paginate_enabled_next {padding-right:3px;}
833.bulkAction {margin-top:10px;}
834#addUserForm p {margin-left:0;}
835#applyActionBlock .actionButtons {margin-left:0;}
836span.infos, span.errors {background-image:none; padding:2px 5px; margin:0;border-radius:5px;}
837
838.userStats {margin-top:10px;}
839.recent_period_infos {margin-left:10px;}
840.nb_image_page, .recent_period {width:340px;margin-top:5px;}
841#action_recent_period .recent_period {display:inline-block;}
842{/literal}{/html_style}
843
844<div class="titrePage">
845  <h2>{'User list'|@translate}</h2>
846</div>
847
848<p class="showCreateAlbum" id="showAddUser">
849  <a href="#" id="addUser" class="icon-plus-circled">{'Add a user'|translate}</a>
850  <span class="infos" style="display:none"></span>
851</p>
852
853<form id="addUserForm" style="display:none" method="post" name="add_user" action="{$F_ADD_ACTION}">
854  <fieldset>
855    <legend>{'Add a user'|@translate}</legend>
856
857    <p>
858      <strong>{'Username'|translate}</strong><br>
859      <input type="text" name="username" maxlength="50" size="20">
860    </p>
861
862    <p>
863      <strong>{'Password'|translate}</strong><br>
864      <input type="{if $Double_Password}password{else}text{/if}" name="password">
865    </p>
866   
867{if $Double_Password}
868    <p>
869      <strong>{'Confirm Password'|@translate}</strong><br>
870      <input type="password" name="password_confirm">
871    </p>
872{/if}
873
874    <p>
875      <strong>{'Email address'|@translate}</strong><br>
876      <input type="text" name="email">
877    </p>
878
879    <p>
880      <label><input type="checkbox" name="send_password_by_mail"> <strong>{'Send connection settings by email'|@translate}</strong></label>
881    </p>
882
883    <p class="actionButtons">
884      <input class="submit" name="submit_add" type="submit" value="{'Submit'|@translate}">
885      <a href="#" id="addUserClose">{'Cancel'|@translate}</a>
886      <span class="loading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
887      <span class="errors" style="display:none"></span>
888    </p>
889  </fieldset>
890</form>
891
892<form method="post" name="preferences" action="">
893
894<table id="userList">
895  <thead>
896    <tr>
897      <th>id</th>
898      <th>{'Username'|@translate}</th>
899      <th>{'Status'|@translate}</th>
900      <th>{'Email address'|@translate}</th>
901      <th>{'Groups'|@translate}</th>
902      <th>{'Privacy level'|@translate}</th>
903      <th>{'registration date'|@translate}</th>
904    </tr>
905  </thead>
906</table>
907
908<div style="clear:right"></div>
909
910<p class="checkActions">
911  {'Select:'|@translate}
912  <a href="#" id="selectAll">{'All'|@translate}</a>,
913  <a href="#" id="selectNone">{'None'|@translate}</a>,
914  <a href="#" id="selectInvert">{'Invert'|@translate}</a>
915
916  <span id="selectedMessage"></span>
917</p>
918
919<fieldset id="action">
920  <legend>{'Action'|@translate}</legend>
921
922  <div id="forbidAction"{if count($selection) != 0} style="display:none"{/if}>{'No user selected, no action possible.'|@translate}</div>
923  <div id="permitAction"{if count($selection) == 0} style="display:none"{/if}>
924
925    <select name="selectAction">
926      <option value="-1">{'Choose an action'|@translate}</option>
927      <option disabled="disabled">------------------</option>
928      <option value="delete" class="icon-trash">{'Delete selected users'|@translate}</option>
929      <option value="status">{'Status'|@translate}</option>
930      <option value="group_associate">{'associate to group'|translate}</option>
931      <option value="group_dissociate">{'dissociate from group'|@translate}</option>
932      <option value="enabled_high">{'High definition enabled'|@translate}</option>
933      <option value="level">{'Privacy level'|@translate}</option>
934      <option value="nb_image_page">{'Number of photos per page'|@translate}</option>
935      <option value="theme">{'Theme'|@translate}</option>
936      <option value="language">{'Language'|@translate}</option>
937      <option value="recent_period">{'Recent period'|@translate}</option>
938      <option value="expand">{'Expand all albums'|@translate}</option>
939{if $ACTIVATE_COMMENTS}
940      <option value="show_nb_comments">{'Show number of comments'|@translate}</option>
941{/if}
942      <option value="show_nb_hits">{'Show number of hits'|@translate}</option>
943    </select>
944
945    {* delete *}
946    <div id="action_delete" class="bulkAction">
947      <p><label><input type="checkbox" name="confirm_deletion" value="1"> {'Are you sure?'|@translate}</label></p>
948    </div>
949
950    {* status *}
951    <div id="action_status" class="bulkAction">
952      <select name="status">
953        {html_options options=$pref_status_options selected=$pref_status_selected}
954      </select>
955    </div>
956
957    {* group_associate *}
958    <div id="action_group_associate" class="bulkAction">
959      {html_options name=associate options=$association_options selected=$associate_selected}
960    </div>
961
962    {* group_dissociate *}
963    <div id="action_group_dissociate" class="bulkAction">
964      {html_options name=dissociate options=$association_options selected=$dissociate_selected}
965    </div>
966
967    {* enabled_high *}
968    <div id="action_enabled_high" class="bulkAction">
969      <label><input type="radio" name="enabled_high" value="true">{'Yes'|@translate}</label>
970      <label><input type="radio" name="enabled_high" value="false" checked="checked">{'No'|@translate}</label>
971    </div>
972
973    {* level *}
974    <div id="action_level" class="bulkAction">
975      <select name="level" size="1">
976        {html_options options=$level_options selected=$level_selected}
977      </select>
978    </div>
979
980    {* nb_image_page *}
981    <div id="action_nb_image_page" class="bulkAction">
982      <strong class="nb_image_page_infos"></strong>
983      <div class="nb_image_page"></div>
984      <input type="hidden" name="nb_image_page" value="{$NB_IMAGE_PAGE}">
985    </div>
986
987    {* theme *}
988    <div id="action_theme" class="bulkAction">
989      <select name="theme" size="1">
990        {html_options options=$theme_options selected=$theme_selected}
991      </select>
992    </div>
993
994    {* language *}
995    <div id="action_language" class="bulkAction">
996      <select name="language" size="1">
997        {html_options options=$language_options selected=$language_selected}
998      </select>
999    </div>
1000
1001    {* recent_period *}
1002    <div id="action_recent_period" class="bulkAction">
1003      <div class="recent_period"></div>
1004      <span class="recent_period_infos"></span>
1005      <input type="hidden" name="recent_period" value="{$RECENT_PERIOD}">
1006    </div>
1007
1008    {* expand *}
1009    <div id="action_expand" class="bulkAction">
1010      <label><input type="radio" name="expand" value="true">{'Yes'|@translate}</label>
1011      <label><input type="radio" name="expand" value="false" checked="checked">{'No'|@translate}</label>
1012    </div>
1013
1014    {* show_nb_comments *}
1015    <div id="action_show_nb_comments" class="bulkAction">
1016      <label><input type="radio" name="show_nb_comments" value="true">{'Yes'|@translate}</label>
1017      <label><input type="radio" name="show_nb_comments" value="false" checked="checked">{'No'|@translate}</label>
1018    </div>
1019
1020    {* show_nb_hits *}
1021    <div id="action_show_nb_hits" class="bulkAction">
1022      <label><input type="radio" name="show_nb_hits" value="true">{'Yes'|@translate}</label>
1023      <label><input type="radio" name="show_nb_hits" value="false" checked="checked">{'No'|@translate}</label>
1024    </div>
1025
1026    <p id="applyActionBlock" style="display:none" class="actionButtons">
1027      <input id="applyAction" class="submit" type="submit" value="{'Apply action'|@translate}" name="submit"> <span id="applyOnDetails"></span>
1028      <span id="applyActionLoading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
1029      <span class="infos" style="display:none">&#x2714; {'Users modified'|translate}</span>
1030    </p>
1031
1032  </div> {* #permitAction *}
1033</fieldset>
1034
1035</form>
1036
1037{* Underscore Template Definition *}
1038<script type="text/template" class="userDetails">
1039<form>
1040  <div class="userActions">
1041<% if (!user.isGuest) { %>
1042    <span class="changePasswordDone infos" style="display:none">&#x2714; {'Password updated'|translate}</span>
1043    <span class="changePassword" style="display:none">{'New password'|translate} <input type="text"> <a href="#" class="buttonLike updatePassword"><img src="themes/default/images/ajax-loader-small.gif" style="margin-bottom:-1px;margin-left:1px;display:none;"><span class="text">{'Submit'|translate}</span></a> <a href="#" class="cancel">{'Cancel'|translate}</a></span>
1044    <a class="icon-key changePasswordOpen" href="#">{'Change password'|translate}</a>
1045    <br>
1046<% } %>
1047
1048    <a target="_blank" href="admin.php?page=user_perm&amp;user_id=<%- user.id %>" class="icon-lock">{'Permissions'|translate}</a>
1049
1050<% if (!user.isProtected) { %>
1051    <br><span class="userDelete"><img class="loading" src="themes/default/images/ajax-loader-small.gif" style="display:none;"><a href="#" class="icon-trash" data-user_id="<%- user.id %>">{'Delete'|translate}</a></span>
1052<% } %>
1053
1054  </div>
1055
1056  <span class="changeUsernameOpen"><strong class="username"><%- user.username %></strong>
1057
1058<% if (!user.isGuest) { %>
1059  <a href="#" class="icon-pencil">{'Change username'|translate}</a></span>
1060  <span class="changeUsername" style="display:none">
1061  <input type="text"> <a href="#" class="buttonLike updateUsername"><img src="themes/default/images/ajax-loader-small.gif" style="margin-bottom:-1px;margin-left:1px;display:none;"><span class="text">{'Submit'|translate}</span></a> <a href="#" class="cancel">{'Cancel'|translate}</a>
1062<% } %>
1063
1064  </span>
1065
1066  <div class="userStats"><%- user.registeredOn_string %><br><%- user.lastVisit_string %></div>
1067
1068  <div class="userPropertiesContainer">
1069    <input type="hidden" name="user_id" value="<%- user.id %>">
1070    <div class="userPropertiesSet">
1071      <div class="userPropertiesSetTitle">{'Properties'|translate}</div>
1072
1073      <div class="userProperty"><strong>{'Email address'|translate}</strong>
1074        <br>
1075<% if (!user.isGuest) { %>
1076        <input name="email" type="text" value="<%- user.email %>">
1077<% } else { %>
1078      {'N/A'|translate}
1079<% } %>
1080      </div>
1081
1082      <div class="userProperty"><strong>{'Status'|translate}</strong>
1083        <br>
1084<% if (!user.isProtected) { %>
1085        <select name="status">
1086  <% _.each( user.statusOptions, function( option ){ %>
1087          <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
1088  <% }); %>
1089        </select>
1090<% } else { %>
1091        <%- user.statusLabel %>
1092<% } %>
1093      </div>
1094
1095      <div class="userProperty"><strong>{'Privacy level'|translate}</strong>
1096        <br>
1097        <select name="level">
1098<% _.each( user.levelOptions, function( option ){ %>
1099          <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
1100<% }); %>
1101        </select>
1102      </div>
1103
1104      <div class="userProperty"><label><input type="checkbox" name="enabled_high"<% if (user.enabled_high == 'true') { %> checked="checked"<% } %>> <strong>{'High definition enabled'|translate}</strong></label></div>
1105
1106      <div class="userProperty"><strong>{'Groups'|translate}</strong><br>
1107        <select data-selectize="groups" placeholder="{'Type in a search term'|translate}"
1108          name="group_id[]" multiple style="width:340px;"></select>
1109      </div>
1110    </div>
1111
1112    <div class="userPropertiesSet userPrefs">
1113      <div class="userPropertiesSetTitle">{'Preferences'|translate}</div>
1114
1115      <div class="userProperty"><strong class="nb_image_page_infos"></strong>
1116        <div class="nb_image_page"></div>
1117        <input type="hidden" name="nb_image_page" value="<%- user.nb_image_page %>">
1118      </div>
1119
1120      <div class="userProperty"><strong>{'Theme'|translate}</strong><br>
1121        <select name="theme">
1122<% _.each( user.themeOptions, function( option ){ %>
1123          <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
1124<% }); %>
1125        </select>
1126      </div>
1127
1128      <div class="userProperty"><strong>{'Language'|translate}</strong><br>
1129        <select name="language">
1130<% _.each( user.languageOptions, function( option ){ %>
1131          <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
1132<% }); %>
1133        </select>
1134      </div>
1135
1136      <div class="userProperty"><strong>{'Recent period'|translate}</strong> <span class="recent_period_infos"></span>
1137        <div class="recent_period"></div>
1138        <input type="hidden" name="recent_period" value="<%- user.recent_period %>">
1139      </div>
1140
1141      <div class="userProperty"><label><input type="checkbox" name="expand"<% if (user.expand == 'true') { %> checked="checked"<% }%>> <strong>{'Expand all albums'|translate}</strong></label></div>
1142
1143      <div class="userProperty"><label><input type="checkbox" name="show_nb_comments"<% if (user.show_nb_comments == 'true') { %> checked="checked"<% }%>> <strong>{'Show number of comments'|translate}</strong></label></div>
1144
1145      <div class="userProperty"><label><input type="checkbox" name="show_nb_hits"<% if (user.show_nb_hits == 'true') { %> checked="checked"<% }%>> <strong>{'Show number of hits'|translate}</strong></label></div>
1146
1147    </div>
1148
1149    <div style="clear:both"></div>
1150  </div> {* userPropertiesContainer *}
1151
1152  <span class="infos propertiesUpdateDone" style="display:none">&#x2714; <%- user.updateString %></span>
1153   
1154  <input type="submit" value="{'Update user'|translate|escape:html}" style="display:none;" data-user_id="<%- user.id %>">
1155  <img class="submitWait" src="themes/default/images/ajax-loader-small.gif" style="display:none">
1156</form>
1157</script>
Note: See TracBrowser for help on using the repository browser.