Changeset 25475


Ignore:
Timestamp:
Nov 13, 2013, 3:40:00 PM (10 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.