Changeset 25475


Ignore:
Timestamp:
11/13/13 15:40:00 (6 years ago)
Author:
plg
Message:

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

work in progress, not finished yet.

Location:
trunk/admin
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/admin/themes/default/template/user_list.tpl

    r25457 r25475  
    33{combine_script id='jquery.dataTables' load='footer' path='themes/default/js/plugins/jquery.dataTables.js'} 
    44{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"} 
    58 
    69{footer_script} 
     
    1013var applyOnDetails_pattern = "{'on the %d selected users'|@translate}"; 
    1114var newUser_pattern = "✔ {'User %s added'|translate}"; 
     15var registeredOn_pattern = "{'Registered on %s, %s.'|translate}"; 
     16var lastVisit_pattern = "{'Last visit on %s, %s.'|translate}"; 
    1217var missingConfirm = "{'You need to confirm deletion'|translate}"; 
    1318var missingUsername = "{'Please, enter a login'|translate}"; 
     
    106111 
    107112          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">'; 
    108127          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>'; 
     128          userDetails += '<div class="userPropertiesSet">'; 
     129          userDetails += '<div class="userPropertiesSetTitle">{/literal}{'Properties'|translate}{literal}</div>'; 
    112130 
    113131          userDetails += '<div class="userProperty"><strong>{/literal}{'Email address'|translate}{literal}</strong>'; 
     
    125143          userDetails += '</select></div>'; 
    126144 
    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  
    141145          userDetails += '<div class="userProperty"><strong>{/literal}{'Privacy level'|translate}{literal}</strong>'; 
    142146          userDetails += '<br><select name="level">'; 
     
    150154          userDetails += '</select></div>'; 
    151155 
    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"'; 
     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"'; 
    158169            } 
    159             userDetails += '<label><input type="radio" name="enabled_high" value="'+value+'"'+checked+'>'+label+'</label>'; 
     170            userDetails += '<option value="'+jQuery(this).val()+'"'+selected+'>'+jQuery(this).html()+'</option>'; 
    160171          }); 
    161           userDetails += '</div>'; 
    162  
    163           userDetails += '</fieldset><fieldset><legend>{/literal}{'Preferences'|translate}{literal}</legend>'; 
     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>'; 
    164177 
    165178          userDetails += '<div class="userProperty"><strong>{/literal}{'Number of photos per page'|translate}{literal}</strong>'; 
     
    191204          userDetails += '<br>'+user.recent_period+'</div>'; 
    192205 
    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           }); 
     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>'; 
    202211          userDetails += '</div>'; 
    203212 
    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          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>'; 
    213218          userDetails += '</div>'; 
    214219 
    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           }); 
     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>'; 
    224225          userDetails += '</div>'; 
    225           userDetails += '</fieldset>'; 
    226  
    227           userDetails += '<input type="submit" value="{/literal}{'Submit'|translate}{literal}" data-user_id="'+userId+'">'; 
     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+'">'; 
    228231          userDetails += '<img class="submitWait" src="themes/default/images/ajax-loader-small.gif" style="display:none">' 
    229232          userDetails += '</form>'; 
    230233 
    231234          jQuery("#user"+userId).append(userDetails); 
     235          jQuery(".chzn-select").chosen(); 
    232236        } 
    233237        else { 
     
    243247  } 
    244248 
     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 
    245256  jQuery(document).on('click', '.userProperties input[type=submit]',  function() { 
    246257    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    } 
    247280 
    248281    jQuery.ajax({ 
    249282      url: "ws.php?format=json&method=pwg.users.setInfo", 
    250283      type:"POST", 
    251       data: jQuery('#user'+userId+' form').serialize(), 
     284      data: formData, 
    252285      beforeSend: function() { 
    253286        jQuery('#user'+userId+' .submitWait').show(); 
     
    255288      success:function(data) { 
    256289        jQuery('#user'+userId+' .submitWait').hide(); 
     290        jQuery('#user'+userId+' input[type=submit]').hide(); 
     291        jQuery('#user'+userId+' .infos').show(); 
    257292      }, 
    258293      error:function(XMLHttpRequest, textStatus, errorThrows) { 
     
    305340    "bServerSide": true, 
    306341    "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    }, 
    307360    "fnDrawCallback": function( oSettings ) { 
    308361      jQuery("#userList input[type=checkbox]").each(function() { 
     
    532585table.dataTable {clear:right;padding-top:10px;} 
    533586.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;} 
    534592.bulkAction {margin-top:10px;} 
    535593#addUserForm p {margin-left:0;} 
     
    537595span.infos, span.errors {background-image:none; padding:2px 5px; margin:0;border-radius:5px;} 
    538596 
    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;} 
     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;} 
    542602.userProperty {width:220px;float:left;margin-bottom:15px;} 
     603 
     604.userActions {float:right;text-align:right;} 
    543605</style> 
    544606{/literal} 
     
    601663      <th>{'Status'|@translate}</th> 
    602664      <th>{'Email address'|@translate}</th> 
     665      <th>{'registration date'|@translate}</th> 
    603666    </tr> 
    604667  </thead> 
  • trunk/admin/user_list_backend.php

    r25194 r25475  
    1212 * you want to insert a non-database field (for example a counter or static image) 
    1313 */ 
    14 $aColumns = array('id', 'username', 'status', 'mail_address'); 
     14$aColumns = array('id', 'username', 'status', 'mail_address', 'registration_date'); 
    1515         
    1616/* Indexed column (used for fast and accurate table cardinality) */ 
Note: See TracChangeset for help on using the changeset viewer.