issue #1265 user manager new design by @GitBluub and @MatthieuLP

Because we had a ghost page user_list_new, I didn't simply merged the feature branch, but I reproduced the new code in a single commit on master.
This commit is contained in:
plegall
2021-05-05 13:41:37 +02:00
parent d29da9f36a
commit fe3147d601
7 changed files with 4075 additions and 1217 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+19 -3
View File
@@ -1925,6 +1925,8 @@ h2:lang(en) { text-transform:capitalize; }
.infos .submit {margin-left:30px;}
.checkActions {text-align:left;padding:0;margin:0;}
#user-table-content #checkActions {margin:0; display:flex; flex-wrap:wrap; align-items:center;}
#user-table-content #checkActions a {padding:10px; margin: 0 4px};
#checkActions {text-align:left; margin:0 0 20px 0;}
.ActionUserList #checkActions {margin: 20px 0 20px 0;}
@@ -2688,20 +2690,27 @@ a#showPermissions:hover {text-decoration: none;}
overflow: hidden;
}
.user-list-checkbox .select-checkbox,
.tag-container .tag-box .select-checkbox {
display: none;
width: 15px;
height: 15px;
border-radius: 100%;
margin: 2px 0px;
/* margin: 2px 0px; */
margin-left: 3.4px;
border: solid #ffa646 2px;
}
.user-list-checkbox .select-checkbox {
display: inline-block;
}
.tag-container.selection .tag-box .select-checkbox {
display: block;
}
.user-list-checkbox:hover .select-checkbox,
.user-list-checkbox[data-selected='1'] .select-checkbox,
.tag-container .tag-box:hover .select-checkbox,
.tag-container .tag-box[data-selected='1'] .select-checkbox {
background-color: #ffa646;
@@ -2711,6 +2720,7 @@ a#showPermissions:hover {text-decoration: none;}
display: block;
}
.user-list-checkbox .select-checkbox i,
.tag-container .tag-box .select-checkbox i {
display: none;
font-size: 14px;
@@ -2722,6 +2732,7 @@ a#showPermissions:hover {text-decoration: none;}
animation-timing-function: ease-out;
}
.user-list-checkbox[data-selected='1'] .select-checkbox i,
.tag-container .tag-box[data-selected='1'] .select-checkbox i {
display: inline;
}
@@ -4616,18 +4627,23 @@ li.plupload_delete a:hover {background: url("images/cancelhover.svg")!important;
#action_delete_derivatives label, #action_generate_derivatives label {display: flex; margin-top: 4px; width: 50%;}
#action_delete_derivatives input[name="del_derivatives_type[]"], #action_generate_derivatives input[name="generate_derivatives_type[]"] {margin-right: 3px;}
.actionButtons:first-child::after,#filter_prefilter::before,#filter_category::before,#filter_level::before,
.permitActionListButton div::before, #action_level::after, .pictureLevels::before {
.permitActionListButton div::before, #action_level::after, .pictureLevels::before,
.user-action-select-container::before, .advanced-filter-select-container::before,
.user-property-select-container::before {
content: '\e835'; font-size: 17px; position: absolute; font-family: "fontello"; color: #6E6E6E; pointer-events: none;
}
.permitActionListButton div::before {margin-left: 250px; margin-top: 11px;}
.pictureLevels::before {margin-left: 216px; margin-top: 10px;}
.permitActionListButton div.hidden::after {display: none;}
.user-action-select-container::before {top: 5px; right:10px}
.user-property-select-container::before {margin-top: 10px; margin-left:270px;}
.advanced-filter-select-container::before {top: 5px; right:10px}
#filter_prefilter::before {margin-left: 257px; margin-top: 35px;}
#filter_category .selectize-control.single .selectize-input::after {content: none;}
#filter_category {width: 600px;}
#filter_category::before {margin-left: 565px;margin-top: 33px; z-index: 2;}
#filter_level::before {margin-top: 34px; margin-left: 260px;}
#action_level::after {margin-top: -56px; margin-left: 254px;}
#batchManagerGlobal #action_level::after {margin-top: -56px; margin-left: 254px;}
#filter_search input {width: 300px; box-sizing: border-box; padding: 11px 18px;}
#applyFilter, #addFilter,#filterList select, #filter_tags .selectize-input.items.not-full.has-options, .pictureLevels select, #permitAction select{
font-family: "Open Sans", "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
+42
View File
@@ -43,11 +43,34 @@ while ($row = pwg_db_fetch_assoc($result))
$groups[$row['id']] = $row['name'];
}
// +-----------------------------------------------------------------------+
// | Dates for filtering |
// +-----------------------------------------------------------------------+
$query = '
SELECT DISTINCT
month(registration_date) as registration_month,
year(registration_date) as registration_year
FROM '.USER_INFOS_TABLE.'
ORDER BY registration_date
;';
$result = pwg_query($query);
$register_dates = array();
while ($row = pwg_db_fetch_assoc($result))
{
$register_dates[] = $row['registration_month'].' '.$row['registration_year'];
}
$template->assign('register_dates', implode(',' , $register_dates));
// +-----------------------------------------------------------------------+
// | template |
// +-----------------------------------------------------------------------+
$template->assign(
array(
'ADMIN_PAGE_TITLE' => l10n('Manage users'),
'ACTIVATE_COMMENTS' => $conf['activate_comments'],
'Double_Password' => $conf['double_password_type_in_admin']
)
@@ -97,6 +120,7 @@ $template->assign(
'password_protected_users' => implode(',', array_unique($password_protected_users)),
'guest_user' => $conf['guest_id'],
'filter_group' => (isset($_GET['group']) ? $_GET['group'] : null),
'connected_user' => $user["id"]
)
);
@@ -132,6 +156,24 @@ foreach ($conf['available_permission_levels'] as $level)
$template->assign('level_options', $level_options);
$template->assign('level_selected', $default_user['level']);
$query = '
SELECT id, name, is_default
FROM `'.GROUPS_TABLE.'`
ORDER BY name ASC
;';
$result = pwg_query($query);
$groups_arr_id = [];
$groups_arr_name = [];
while ($row = pwg_db_fetch_assoc($result))
{
$groups_arr_name[] = '"'.pwg_db_real_escape_string($row["name"]).'"';
$groups_arr_id[] = $row["id"];
}
$template->assign('groups_arr_id', implode(',', $groups_arr_id));
$template->assign('groups_arr_name', implode(',', $groups_arr_name));
$template->assign('guest_id', $conf["guest_id"]);
// +-----------------------------------------------------------------------+
// | html code display |
+132 -24
View File
@@ -14,11 +14,16 @@
* @option string username (optional)
* @option string[] status (optional)
* @option int min_level (optional)
* @option int max_level (optional)
* @option int[] group_id (optional)
* @option int per_page
* @option int page
* @option string order
* @option string display
* @option string filter
* @option int[] exclude (optional)
* @option string min_register
* @option string max_register
*/
function ws_users_getList($params, &$service)
{
@@ -36,6 +41,44 @@ function ws_users_getList($params, &$service)
$where_clauses[] = 'u.'.$conf['user_fields']['username'].' LIKE \''.pwg_db_real_escape_string($params['username']).'\'';
}
$filtered_groups = array();
if (!empty($params['filter']))
{
$filter_query = 'SELECT id FROM '. GROUPS_TABLE .' WHERE name LIKE \''. $params['filter'] . '\';';
$filtered_groups_res = pwg_query($filter_query);
while ($row = pwg_db_fetch_assoc($filtered_groups_res))
{
$filtered_groups[] = $row['id'];
}
$filter_where_clause = '('.'u.'.$conf['user_fields']['username'].' LIKE \''.
pwg_db_real_escape_string($params['filter']).'\' OR '
.'u.'.$conf['user_fields']['email'].' LIKE \''.
pwg_db_real_escape_string($params['filter']).'\'';
if (!empty($filtered_groups)) {
$filter_where_clause .= 'OR ug.group_id IN ('. implode(',', $filtered_groups).')';
}
$where_clauses[] = $filter_where_clause.')';
}
if (!empty($params['min_register'])) {
list($min_register_month, $min_register_year) = explode(' ', $params["min_register"]);
if (strlen($min_register_month) == 1) {
$min_register_month = "0".$min_register_month;
}
$where_clauses[] = 'ui.registration_date >= \''.$min_register_year.'-'.$min_register_month.'-01 00:00:00\'';
}
if (!empty($params['max_register'])) {
list($max_register_month, $max_register_year) = explode(' ', $params["max_register"]);
if (strlen($max_register_month) == 1) {
$max_register_month = "0".$max_register_month;
}
$where_clauses[] = 'ui.registration_date <= adddate(\''.$max_register_year.'-'.$max_register_month.'-01 00:00:00\', interval 1 month)';
}
if (!empty($params['status']))
{
$params['status'] = array_intersect($params['status'], get_enums(USER_INFOS_TABLE, 'status'));
@@ -54,11 +97,25 @@ function ws_users_getList($params, &$service)
$where_clauses[] = 'ui.level >= '.$params['min_level'];
}
if (!empty($params['max_level']))
{
if ( !in_array($params['max_level'], $conf['available_permission_levels']) )
{
return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid level');
}
$where_clauses[] = 'ui.level <= '.$params['max_level'];
}
if (!empty($params['group_id']))
{
$where_clauses[] = 'ug.group_id IN('. implode(',', $params['group_id']) .')';
}
if (!empty($params['exclude']))
{
$where_clauses[] = 'u.'.$conf['user_fields']['id'].' NOT IN('. implode(',', $params['exclude']) .')';
}
$display = array('u.'.$conf['user_fields']['id'] => 'id');
if ($params['display'] != 'none')
@@ -72,7 +129,7 @@ function ws_users_getList($params, &$service)
'nb_image_page','recent_period','expand','show_nb_comments','show_nb_hits',
'enabled_high','registration_date','registration_date_string',
'registration_date_since', 'last_visit', 'last_visit_string',
'last_visit_since'
'last_visit_since', 'total_count'
);
}
else if (in_array('basics', $params['display']))
@@ -81,6 +138,10 @@ function ws_users_getList($params, &$service)
'username','email','status','level','groups',
));
}
else if (in_array('only_id', $params["display"]))
{
$params['display'] = array();
}
$params['display'] = array_flip($params['display']);
// if registration_date_string or registration_date_since is requested,
@@ -127,6 +188,10 @@ function ws_users_getList($params, &$service)
$query = '
SELECT DISTINCT ';
// ADD SQL_CALC_FOUND_ROWS if display total_count is requested
if (isset($params['display']['total_count'])) {
$query .= 'SQL_CALC_FOUND_ROWS ';
}
$first = true;
foreach ($display as $field => $name)
{
@@ -140,7 +205,6 @@ SELECT DISTINCT ';
if (!$first) $query.= ', ';
$query.= 'ui.last_visit_from_history AS last_visit_from_history';
}
$query.= '
FROM '. USERS_TABLE .' AS u
INNER JOIN '. USER_INFOS_TABLE .' AS ui
@@ -149,13 +213,21 @@ SELECT DISTINCT ';
ON u.'. $conf['user_fields']['id'] .' = ug.user_id
WHERE
'. implode(' AND ', $where_clauses) .'
ORDER BY '. $params['order'] .'
LIMIT '. $params['per_page'] .'
OFFSET '. ($params['per_page']*$params['page']) .'
;';
ORDER BY '. $params['order'];
if ($params["per_page"] != 0 || !empty($params["display"])) {
$query .= '
LIMIT '. $params['per_page'].'
OFFSET '. ($params['per_page']*$params['page']) .';
;';
}
$users = array();
$result = pwg_query($query);
/* GET THE RESULT OF SQL_CALC_FOUND_ROWS if display total_count is requested*/
if (isset($params['display']['total_count'])) {
$total_count_query_result = pwg_query('SELECT FOUND_ROWS();');
list($total_count) = pwg_db_fetch_row($total_count_query_result);
}
while ($row = pwg_db_fetch_assoc($result))
{
$row['id'] = intval($row['id']);
@@ -165,24 +237,55 @@ SELECT DISTINCT ';
}
$users[ $row['id'] ] = $row;
}
$users_id_arr = array();
if (count($users) > 0)
{
if (isset($params['display']['groups']))
{
$query = '
SELECT user_id, group_id
SELECT user_id, group_id
FROM '. USER_GROUP_TABLE .'
WHERE user_id IN ('. implode(',', array_keys($users)) .')
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
$users[ $row['user_id'] ]['groups'][] = intval($row['group_id']);
}
}
foreach ($users as $cur_user)
{
$users_id_arr[] = $cur_user['id'];
if (isset($params['display']['registration_date_string'])) {
$users[$cur_user['id']]['registration_date_string'] = format_date($cur_user['registration_date'], array('day', 'month', 'year'));
}
if (isset($params['display']['registration_date_since'])) {
$users[ $cur_user['id'] ]['registration_date_since'] = time_since($cur_user['registration_date'], 'month');
}
if (isset($params['display']['last_visit'])) {
$last_visit = $cur_user['last_visit'];
$users[ $cur_user['id'] ]['last_visit'] = $last_visit;
if (!get_boolean($cur_user['last_visit_from_history']) and empty($last_visit))
{
$last_visit = get_user_last_visit_from_history($cur_user['id'], true);
$users[ $cur_user['id'] ]['last_visit'] = $last_visit;
}
if (isset($params['display']['last_visit_string']))
{
$users[ $cur_user['id'] ]['last_visit_string'] = format_date($last_visit, array('day', 'month', 'year'));
}
if (isset($params['display']['last_visit_since']))
{
$users[ $cur_user['id'] ]['last_visit_since'] = time_since($last_visit, 'day');
}
}
}
/* Removed for optimization above, dont go through the $users array for evert display
if (isset($params['display']['registration_date_string']))
{
foreach ($users as $cur_user)
@@ -221,22 +324,27 @@ SELECT user_id, group_id
{
$users[ $cur_user['id'] ]['last_visit_since'] = time_since($last_visit, 'day');
}
}
}
}*/
}
$users = trigger_change('ws_users_getList', $users);
return array(
'paging' => new PwgNamedStruct(
array(
'page' => $params['page'],
'per_page' => $params['per_page'],
'count' => count($users)
)
),
'users' => new PwgNamedArray(array_values($users), 'user')
if ($params["per_page"] == 0 && empty($params["display"])) {
$method_result = $users_id_arr;
} else {
$method_result = array(
'paging' => new PwgNamedStruct(
array(
'page' => $params['page'],
'per_page' => $params['per_page'],
'count' => count($users)
)
),
'users' => new PwgNamedArray(array_values($users), 'user')
);
}
if (isset($params['display']['total_count'])) {
$method_result['total_count'] = $total_count;
}
return $method_result;
}
/**
+36
View File
@@ -1076,6 +1076,42 @@ $lang['Please upgrade your PHP version before any update.'] = 'Please upgrade yo
$lang['Requires PHP %s'] = 'Requires PHP %s';
$lang['%s MB used'] = '%s MB used';
$lang['%s GB used'] = '%s GB used';
$lang['Manage users'] = 'Manage users';
$lang['between %s and %s'] = 'between %s and %s';
$lang['Edit guest user'] = 'Edit guest user';
$lang['New user added'] = 'New user added';
$lang['Edit'] = 'Edit';
$lang['Advanced filter'] = 'Advanced filter';
$lang['Registered'] = 'Registered';
$lang['Email Adress'] = 'Email Adress';
$lang['Select groups or type them'] = 'Select groups or type them';
$lang['Update'] = 'Update';
$lang['Close'] = 'Close';
$lang['User updated'] = 'User updated';
$lang['Delete user'] = 'Delete user';
$lang['Theme'] = 'Theme';
$lang['Language'] = 'Language';
$lang['Add a new user'] = 'Add a new user';
$lang['Show'] = 'Show';
$lang['Generate random password'] = 'Generate random password';
$lang['Email'] = 'Email';
$lang['Add User'] = 'Add User';
$lang['Jan'] = 'Jan';
$lang['Feb'] = 'Feb';
$lang['Mar'] = 'Mar';
$lang['Apr'] = 'Apr';
$lang['May'] = 'May';
$lang['Jun'] = 'Jun';
$lang['Jul'] = 'Jul';
$lang['Aug'] = 'Aug';
$lang['Sep'] = 'Sep';
$lang['Oct'] = 'Oct';
$lang['Nov'] = 'Nov';
$lang['Dec'] = 'Dec';
$lang['Change Password'] = 'Change Password';
$lang['Photos per page'] = 'Photos per page';
$lang['Users not logged in will have these settings applied, these settings are used by default for new users'] = 'Users not logged in will have these settings applied, these settings are used by default for new users';
$lang['Last visit'] = 'Last visit';
$lang['Activity peak in the last weeks'] = 'Activity peak in the last weeks';
$lang['%d Activities'] = '%d Activities';
$lang['%d Activity'] = '%d Activity';
+36
View File
@@ -1078,6 +1078,42 @@ $lang['Please upgrade your PHP version before any update.'] = 'Il faudra mettre
$lang['Requires PHP %s'] = 'Requiert PHP %s';
$lang['%s MB used'] = '%s MB utilisés';
$lang['%s GB used'] = '%s GB utilisés';
$lang['Manage users'] = 'Gérer les utilisateurs';
$lang['between %s and %s'] = 'entre %s et %s';
$lang['Edit guest user'] = 'Editer l\'utilisateur invité';
$lang['New user added'] = 'Nouvel utilisateur ajouté';
$lang['Edit'] = 'Editer';
$lang['Advanced filter'] = 'Filtres avancés';
$lang['Registered'] = 'Enregistré';
$lang['Email Adress'] = 'Adresse mail';
$lang['Select groups or type them'] = 'Sélectionne des groupes ou écris les';
$lang['Update'] = 'Modifier';
$lang['Close'] = 'Fermer';
$lang['User updated'] = 'Utilisateur modifié';
$lang['Delete user'] = 'Supprimer l\'utilitsateur';
$lang['Theme'] = 'Thème';
$lang['Language'] = 'Langue';
$lang['Add a new user'] = 'Ajouter un nouvel utilisateur';
$lang['Show'] = 'Montrer';
$lang['Generate random password'] = 'Générer un mot de passe aléatoire';
$lang['Email'] = 'Email';
$lang['Add User'] = 'Ajouter l\'utlisateur';
$lang['Jan'] = 'Jan';
$lang['Feb'] = 'Fev';
$lang['Mar'] = 'Mar';
$lang['Apr'] = 'Avr';
$lang['May'] = 'Mai';
$lang['Jun'] = 'Jun';
$lang['Jul'] = 'Jul';
$lang['Aug'] = 'Aou';
$lang['Sep'] = 'Sep';
$lang['Oct'] = 'Oct';
$lang['Nov'] = 'Nov';
$lang['Dec'] = 'Dec';
$lang['Change Password'] = 'Modifier le mot de passe';
$lang['Photos per page'] = 'Photos par page';
$lang['Users not logged in will have these settings applied, these settings are used by default for new users'] = 'Les utilisateurs non connectés vont avoir ces paramètres appliqués, ces paramètres sont utilisés par défaut pour les nouveaux utilisateurs';
$lang['Last visit'] = 'Dernière visite';
$lang['Activity peak in the last weeks'] = 'Pics d\'activité des dernières semaines';
$lang['%d Activities'] = '%d Activités';
$lang['%d Activity'] = '%d Activité';